一、Java继承体系中成员的关系【成员变量、构造函数、成员方法】
A:成员变量
子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?
子类的方法访问变量的查找顺序:
①在子类方法的局部范围找,有就使用。
②在子类的成员范围找,有就使用。
③在父类的成员范围找,有就使用。
④找不到,就报错。
B:构造方法(构造函数的目的是初始化对象)
a:子类的构造方法默认会去访问父类的无参构造方法, 是为了子类访问父类数据的初始化。
b:父类中如果没有无参构造方法,怎么办?
①子类通过super去显示调用父类的带参构造。
②子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造,让父类提供无参构造。
③在父类中添加一个无参构造。
注意事项:
①如果子类没有显式调用父类的构造函数,则默认调用父类的无参构造。
②子类中一定要有一个去访问父类的构造方法,否则父类数据就没有初始化。子类可能会用到父类中的数据。
③this(...)或者super(...)必须出现在第一条语句上。如果不是放在第一条语句,就可能对父类数据进行了多次初始化,所以必须放在第一条语句。
class Father{
public Father(){
System.out.println("Father的无参构造");
}
public Father(String name){
System.out.println("Father的有参构造");
}
}
class Son extends Father{
public Son(){
super("userName");
System.out.println("Son的无参构造");
}
public Son(String name){
this();
System.out.println("Son的有参构造");
}
}
public class ExtendsDemo {
public static void main(String[] args) {
Son s1 = new Son();
System.out.println("----------------");
Son s2 = new Son("userName");
}
}
/*
Father的有参构造
Son的无参构造
----------------
Father的有参构造
Son的无参构造
Son的有参构造
* */
C:成员方法。
子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
通过子类对象访问一个方法的查找顺序:
①在子类中找,有就使用。
②在父类中找,有就使用。
③找不到,就报错。
二、this和super的区别和各自的作用?
this代表本类对应的引用
super代表父类存储空间的标识【可以理解为父类的引用可以操作父类的成员】
A:调用成员变量
this.成员变量, 调用本类的成员变量。
super.成员变量,调用父类的成员变量。
B:调用构造方法
this(...),调用本类的构造方法。
super(...),调用父类的构造方法。
C:调用成员方法
this.成员方法,调用本类的成员方法。
super.成员方法,调用父类的成员方法。
三、数据初始化:一个类的初始化过程、子父类的构造执行过程、分层初始化
①子父类的初始化【分层进行的】:先进行父类的初始化,然后进行子类的初始化。
②单个类的初始化顺序:
a、成员变量的初始化:默认初始化->显式初始化->构造函数初始化
示例二: