提到子类对象的实例化,就得先对this 与super做一个回顾
1.this关键字
1.可以调用的结构:属性、方法;构造器
2.this调用属性、方法:
this理解为:当前对象 或 当前正在创建的对象
1> 在类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用
当前对象属性或方法。但是,通常情况下,我们都择省略"this."。
特殊情况下,如果方法的形参和类的属性同名时,我们必须显式
的使用"this.变量"的方式,表明此变量是属性,而非形参。
2> 在类的构造器中,我们可以使用"this.属性"或"this.方法"的方式,调
用当前正在创建的对象属性或方法。但是,通常情况下,我们都择省略
"this."。特殊情况下,如果构造器的形参和类的属性同名时,我们必须
显式的使用"this.变量"的方式,表明此变量是属性,而非形参。
3.this调用构造器:
① 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类
中指定的其他构造器
② 构造器中不能通过"this(形参列表)"方式调用自己
③ 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参
列表)"
④ 规定:"this(形参列表)"必须声明在当前构造器的首行
⑤ 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构
造器
2.super关键字
1.super 关键字可以理解为:父类的
2.可以用来调用的结构:属性、方法、构造器
3.super调用属性、方法:
1> 我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.
方法"的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我
们习惯省略"super."
2> 特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用
父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是
父类中声明的属性。
3> 特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用
父类中被重写的方法时,则必须显式的使用"super.方法"的方式,表明调用
的是父类中被重写的方法。
4.super调用构造器:
1> 我们可以在子类的构造器中显式的使用"super(形参列表)"的方式,调
用父类中声明的指定的构造器
2> "super(形参列表)"的使用,必须声明在子类构造器的首行!
3> 我们在类的构造器中,针对于"this(形参列表)"或"super(形参列表)"
只能二选一,不能同时出现
4> 在构造器的首行,没显式的声明"this(形参列表)"或"super(形参列表)"
,则默认调用的是父类中空参的构造器:super()
5> 在类的多个构造器中,至少一个类的构造器中使用了"super(形参列表)",
调用父类中的构造器
子类对象实例化过程
- 子类继承父类以后,就获取了父类中声明的属性或方法。
- 当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,…直到调用了java.lang.Object类中空参的构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中父类中的结构,子类对象才可以考虑进行调用。
- 创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。
public Man(String name, int age) {
this(age);
super();
this.age = age;
this.name = name;
}
public Man(int age) {
this.age = age;
}
注意:
- 虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即为new的子类对象。