欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java学习日记7——类的继承、super使用规则

程序员文章站 2022-10-03 16:18:54
Java学习日记7——类的继承、super使用规则 继承是面向对象编程的最重要的特征之一,子类和父类(超类)之间的关系:子类不但会继承父类的属性和行为,而且还可以添加新的属性和行为。继承的好处就是可以提高程序的抽象程度,实现代码的重用,提高代码的开发效率和可维护性。派生子类的方法:使用关键词extends 注意:如果没有extends语句,那么默认所有类都是java.lang.Object的子类class student extends person{String school;int sc...

Java学习日记7——类的继承、super使用规则

 继承是面向对象编程的最重要的特征之一,子类和父类(超类)之间的关系:子类不但会继承父类的属性和行为,而且还可以添加新的属性和行为。继承的好处就是可以提高程序的抽象程度,实现代码的重用,提高代码的开发效率和可维护性。
派生子类的方法:使用关键词extends
注意:如果没有extends语句,那么默认所有类都是java.lang.Object的子类

class student extends person{
	String school;
	int score;
	void learn(){
	...
	};
}

字段的继承——变量继承
 1.字段的继承:子类会继承父类的所有字段,例如student类会包含person的所有变量。
 2.字段的隐藏:如果在子类中定义了与父类里面完全相同的变量,也就是将父类的变量重新进行了定义,那么这时父类的变量就会被隐藏,无法再引用。
 3.字段的增加:直接在子类中加入新的字段(变量域)就可以。

方法的继承——行为继承
 方法继承:在默认情况下,父类的方法也会字段全部被继承(不包括私有方法private)
 方法的覆盖(override):与字段的隐藏相似,如果子类定义与父类重名的方法,那么这个方法将会修改子类的方法的具体实现方式,而不会再调用父类的方法。在JDK1.5以后,可以新加(@voerride)字符标注覆盖的方法。

public class person{
	String name ;
	int age;
	void say(){
		System.out.println("hello!");
	}
}
class student extends person{
	String school;
	int score;
	void say(){
		System.out.println("你好!");
	};

 方法的重载(overload):如果一个类中有多个同名的方法,那么这成为方法的重载。同时可以重载父类的同名方法。与覆盖不同的是,重载不要求参数类型列表相同。重载的方法实际是新加的方法。
举例如下:

public class person{
	String name ;
	int age;
	void say(){
		System.out.println("hello!");
	}
}
class student extends person{
	String school;
	int score;
	void say(another person){//方法的签名是another person
		System.out.println("你好!");
	};
	void say(another student){//函数的签名是another student
		System.out.println("你好!同学");
	};
}

super的使用方法
1.使用super区别访问父类的域和方法
 正是由于继承,使用this可以访问父类的域和方法,但是有时为了明确的指明父类的域和方法,就用到关键字super。
例如:

public class person{
	String name ;
	int age;
	void say(){
		System.out.println("hello!");
	}
}
class student extends person{
	String school;
	int score;
	a = this.age;
	a = super.age;
}

 在父类中有一个age,在子类中用age,this.age,super.age都是访问age,是一样的。
2.在覆盖父类的同时调用父类的方法
 在这时super的作用是访问已经被隐藏的父类方法,这时就会调用父类方法的时候也重新定义新的方法。

public class person{
	String name ;
	int age;
	void say(){
		System.out.println("hello!");
	}
}
class student extends person{
	String school;
	int score;
	void say(){
		super.say();//调用父类的say函数
		System.out.println("my school is :"+school);
	}
}

3.调用父类的构造方法
 因为在一定意义上构造方法是不能继承的,可以用super来调用父类的构造方法,而且super必须放在第一句。

public class person{
	String name ;
	int age;
	//父类构造方法
	public person(String name, int age){
		this.name = name;
		this.age = age;
	}
}
class student extends person{
	String school;
	int score;
	//子类构造方法
	public student(String name, int age, String school, int score){
		super(name,age);//super调用父类构造方法
		this.school = school;
		this.score = score;
	}
}

父类与子类对象的转换
类似于基本数据类型之间的转换,也存在继承关系对象的转换。
 1.子类对象可以被视为其父类的一个对象:例如:一个学生,也是一个人。需要一个人对象,给一个学生对象是可以的。
 2.但是父类对象不能被当做其某一个子类的对象。例如:不能说人都是学生吧!!!但是可以说学生都是人!!!(杠精别杠)
 3.如果一个方法的形式参数是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数。
 4.如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以强制转换成子类对象的引用。
下面用代码举例子:注意看注释

public static void main(String [] args)
{
	person p = new person("张三",15);
	student s = new student("李四",34,"暨南大学",99);
	person pp= new student("王五",22,"中山大学",99);//需要person类型,但是给student对象也可以
	student s_error = (student)p;//编译可以通过,但是实际不执行,运行不行
	student ss = (student) pp;//实现类型的转换,因为pp的实际指向是子类student
	//调用方法时
	p.say(s);//这里给person的方法带上一个student对象也是可以的,实际执行的是student的say()
	//创建数组时
	person [] person_array = new person[100];//创建person类型的100个人的数组
	//但是实际存放可以是student和person都可以
	person_array[0] = new person("zhang",17);
	person_array[1] = new student("cheng",17,"JNU",99);
}

如果你对Java有兴趣,可以了解一下前面几期的基础知识!下面附上链接:

Java编程基础认知:Java学习日记1——基础认知
Java面向对象编程认识:Java学习日记2——面向对象编程认知
Java程序的基本结构认识:Java学习日记3——程序类型与构成认知
Java的输入输出方法总结:Java学习日记4——Java输入输出方法总结
Java的数据类型、变量、常量、运算符:Java学习日记5——数据类型、变量、常量、运算符、数组
Java学习日记6——类、字段、方法、this的使用:Java学习日记6——类、字段、方法、this的使用

本文地址:https://blog.csdn.net/weixin_44005494/article/details/107670751