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

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的使用

你可能感兴趣的:(Java学习日记)