子父类中成员函数的特点。
当子父类都有构造函数时,发现结果为:
fu constructor run
zi constructor run
先执行了父类的构造函数,再执行子类的构造函数。
为什么?
因为子类的所有的构造函数中的第一行都有一句隐式语句super();//默认调用的是父类中的空参数的构造函数。
class Fu
{
Fu()
{
System.out.println("fu constructor run");
}
}
class Zi extends Fu
{
Zi()
{
//super();
System.out.println("zi constructor run");
}
}
子类中的构造函数为什么有一句隐式的super()呢?
原因:子类会继承父类中的内容,所以子类在初始化时,必须先到父类中执行父类的初始化动作。才可以更方便地使用父类中的内容。
当父类中没有空参数构造函数时,子类的构造函数必须通过显示的super语句指定要访问的父类中的构造函数。
这就是子类实例化的过程.
class Fu
{
Fu()
{
System.out.println("fu constructor run..a..");
}
Fu(int x)
{
//显示初始化
System.out.println("fu constructor run..b.."+x);
}
}
class Zi extends Fu
{
Zi()
{
//super();
System.out.println("zi constructor run..c..");
}
Zi(int x)
{
//super();
System.out.println("zi constructor run..d.."+x);
}
}
class ExtendsDemo3
{
public static void main(String[] args)
{
new Zi();
new Zi(6);
}
}
打印的结果是:a c a d .
细节:
1,如果子类的构造函数第一行写了this调用了本类其他构造函数语句,那么super调用父类的语句还有吗?
没有的,因为this()或者super()只能定义在构造函数的第一行,因为初始化动作要先执行。
2,父类构造函数中是否有隐式的super呢?
有的,记住:只要是构造函数默认第一行都是super();
父类的父亲是谁呢?super调用的到底是谁的构造函数呢?
java体系在设计,定义了一个所有对象的父类Object。
总结:
类中的构造函数默认第一行都有隐式的super()语句,在访问父类中的构造函数。
所以父类的构造函数既可以给自己的对象初始化,也可以给自己的子类对象初始化。
问题:
1,this语句和super语句是否可以在同一个构造函数中出现呢?
不行,因为必须定义在第一行。
2,为什么要定义在第一行呢?
因为初始化的动作要先执行。
子类的实例化过程的应用,也是super调用的应用。
什么时候用super调用父类中构造函数,只要使用父类的指定初始化动作,就在子类中通过super(参数列表)格式进行调用。
class Person
{
private String name;
private int age;
public Person(String name,int age)
{
this.name=name;
this,age=age;
}
public void setName(String name)
{
this name=name;
}
public int getName()
{
return name;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return age;
}
}
class Student extends Person
{
public Student(String name,int age)
{
super(name,age);
}
public void study()
{}
}
class Worker extends Person
{
public Worker(String name,int age)
{
//调用父类,使用父类的初始化动作
super(name,age);
}
public void work()
{}
}