在类的一般方法里都有默认:this 用于指向当前对象
在构造函数中都有隐式的:super 用于指向父类
构造函数:
class 类名{
类名(){
super();
对象的显式初始化
}
}
在调用构造函数时,会先执行super 进入父类的构造函数初始化父类,再返回子类的构造函数,将子类的对象显示初始化
class Fu{
int num=3;
Fu(){//构造函数
System.out.println("Fu!");
}
}
class Zi extends Fu{
int num=4;
Zi() {
System.out.println("Zi!");
}
}
public class extendsBasic {
public static void main(String[] args) {
new Zi();
}
}
输出:Fu! Zi!
在继承关系中子类会有一个super 标志父类(标志谁是它的父类)
//
当父类没有默认构造函数(自定义了有参数列表的构造函数)
在子类的构造函数内需要显式的super (参数);显示初始化父类
class Fu{
int num=3;
Fu(int x){//构造函数有参数列表
System.out.println("Fu!"+x);
}
}
class Zi extends Fu{
int num=4;
Zi() {//子类的构造函数
super(8);//显式构造父类
System.out.println("Zi!");
}
}
public class extendsBasic {
public static void main(String[] args) {
new Zi();
}
}
输出:Fu!8
Zi!
例如:
class Fu{
Fu(){
System.out.println("A");
}
Fu(int x){
System.out.println("B"+x);
}
}
class Zi extends Fu{
Zi(){
System.out.println("C");
}
Zi(int x){
System.out.println("D "+x);
}
}
public class extendsBasic {
public static void main(String[] args) {
new Zi();
new Zi(66);
}
}
输出:A
C
A
D 66
new Zi();-------Zi()->super()->Fu()
new Zi(6);------Zi(int x)->super()->Fu()
以上称为:子类的实例化
细节:
1.如果在构造函数里第一行写了this();那么super();语句在函数里不存在——因为this 和super 只能在第一行
Zi(){//在这个函数里还有super 对父类进行初始化
System.out.println("C");
}
Zi(int x){
this();//在这个构造函数里没有了super
System.out.println("D "+x);
}
2.在父类的构造函数中也有隐式的super()-------只要是构造函数第一行都默认为super();除非你自己手动的明确(super 和this 都仅能在第一行)
父类的父类是?---在Java体系设计中,定义了一个所有类的父类object(在虚拟机启动时就存在了)
总结:
父类的构造函数可以为自己的对象初始化,也可以为自己子类的对象初始化
在构造函数中的第一行都有隐式的super();
如果隐式的super(); 没有对应的(在父类中)构造函数,必须在构造函数(子类的)中通过this 或者super()的形式明确构造函数
this 和super 不能同时在一个构造函数中————因为他们都要在第一行————初始化必须要先完成