子父类中构造函数的特点-----子类实例化过程

来源:互联网 发布:云墙mac下载 编辑:程序博客网 时间:2024/05/18 02:46
  •     子类中调用父类的构造函数用super(); 在对子类的对象初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一个super():会访问父类中空参数的构造函数,子类中所有的构造函数默认第一行都是super()。
class Fu
{
Fu()
{
System.out.println("fu run");
}
Fu(int x)
{
System.out.println("fu run..."+x);
}
}


class Zi extends Fu
{
Zi()
{
super();//隐式的super,调用父类构造函数Fu()
System.out.println("zi run");
}
}


class Demo
{
public static void main(String[] args)
{
Zi z = new Zi();
}
}
输出:fu run
zi run
  • 为什么子类一定要访问父类中的构造函数:
因为父类中的数据子类可以直接获取,所以子类对象在建立时需要先查看父类是如何对这些数据进行初始化的,所以子类在对象初始化时,要先访问一下父类中的构造函数,如果要访问父类中的特定构造函数,要手动定义super()
当父类中没有空参数构造函数时,必须显示的写出super()函数;

class Fu
{
Fu(int x)
{
System.out.println("fu run..."+x);
}
}


class Zi extends Fu
{
Zi()
{
super();//隐式的super,调用父类构造函数Fu()
super(3);//显示的写出要调用的构造函数
System.out.println("zi run");
}
}
class Demo
{
public static void main(String[] args)
{
Zi z = new Zi();
}
}
输出 fu run...3
zi run

  • 子类中的构造函数第一行可以用this()调用本类的父类
子类中至少有一个构造函数访问父类
class Fu
{
Fu()
{
System.out.println("fu run");
}
Fu(int x)
{
System.out.println("fu run..."+x);
}
}


class Zi extends class Fu
{
Zi()
{
super();//隐式的super,调用父类构造函数Fu()
System.out.println("zi run");
}
Zi(int x)
{
this();//调用本类的构造函数Zi();
System.out.println("zi fun..."+x);
}
}


class Demo
{
public static void main(String[] args)
{
Zi z = new Zi();
Zi z1= new Zi(3);
}
}

输出:fu run
zi run
fu run
zi run
zi run...3



注意:
  • 子类的所有构造函数,默认都会访问父类中空参数的构造函数,因为子类每一个构造函数内的第一行都有一句隐式super();
  • 当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来访问指定的父类中的构造函数
  • 父类构造函数也有super(),调用Object的构造函数
  • this,super不能同时出现,他们都要先执行,因为要先初始化。