继承的进一步研究
1.1 子类对象实例化过程
子类对象的实例化::先调用父类的构造方法,然后再调用子类的构造方法。
实例:
class Person { private String name; private int age; public Person(){ System.out.println("父类person中的构造:"); } public void setName(String name){ this.name=name; } public void setAge(int age){ this.age=age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } }; class Student extends Person { //此处添加代码 private String school; public Student(){ System.out.println("子类Student中的构造:"); } public void setSchool(String school){ this.school=school; } public String getSchool(){ return this.school; } } public class ExDemo01 { public static void main(String args[]){ Student stu = new Student(); //stu.setName("张三"); //stu.fun(); } } 结果为: F:\java>javac ExDemo01.java F:\java>java ExDemo01 父类person中的构造: 子类Student中的构造: 注意:实际上,此时,对于子类的构造方法中,隐含了一个“super”的语句。有时候将父类成为“超类”。 class Person { private String name; private int age; public Person(){ System.out.println("父类person中的构造:"); } public void setName(String name){ this.name=name; } public void setAge(int age){ this.age=age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } }; class Student extends Person { //此处添加代码 private String school; public Student(){ super();//默认隐藏 System.out.println("子类Student中的构造:"); } public void setSchool(String school){ this.school=school; } public String getSchool(){ return this.school; } } public class ExDemo01 { public static void main(String args[]){ Student stu = new Student(); //stu.setName("张三"); //stu.fun(); } }
1.2 方法的覆盖
子类定义了与父类同名的方法,但在方法覆盖时候必须考虑到权限。即被子类覆盖的方法不能拥有比父类方法更加严格的访问权限。
所以父类中使用public定义的方法,子类的访问权限必须是public。
java中,访问权限有四种:
private:最小的访问权限
default:什么都不声明
public:最大的访问权限
private《default《public;
实例:
class Person { void print(){ System.out.println("父类"); } }; class Student { public void print(){ System.out.println("子类"); } }; public class ExDemo03 { public static void main(String args[]){ Student stu = new Student(); stu.print(); } }
输出为;
F:\java>javac ExDemo03.java
F:\java>java ExDemo03
子类
1.3 如果飞要调用父类的被覆盖的方法呢?
通过super关键字就可以完成此功能,super关键字可以从子类访问父类的内容,如果要访问被覆盖的方法:super.方法();
//import java.lang.*;
class Person
{
void print(){
System.out.println("父类");
}
};
class Student extends Person
{
public void print(){
super.print();
System.out.println("子类");
}
};
public class ExDemo03
{
public static void main(String args[]){
Student stu = new Student();
stu.print();
}
}
结果为:
F:\java>javac ExDemo03.java
F:\java>java ExDemo03
父类
子类
如果去掉super,默认是this.print();程序不断调用自己的子类的print();
//import java.lang.*; class Person { void print(){ System.out.println("父类"); } }; class Student extends Person { public void print(){ print(); System.out.println("子类"); } }; public class ExDemo03 { public static void main(String args[]){ Student stu = new Student(); stu.print(); } }
结果:
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
1.4 this与super的区别
A:属性访问
this访问本类中的属性,如果本类没有此属性则从父类中继续查找。
super直接访问父类的属性
B:方法
this访问本类中的方法,如果本类没有此方法则从父类中继续查找。
super直接访问父类的方法
C:构造调用
this调用本类构造
super调用父类构造
D:
this表示当前对象
super无此概念