检查对象是否被争取构造是构造器的一项任务。
1.1导出类会按照继承层次逐渐向上调用基类构造器,1.2然后按照声明顺序调用成员初始化方法,1.3最后调用导出类构造器主体;
如果没有明确调用(super关键字)哪个基类构造器,则默认调用(无参),若基类没有默认构造器的话编译报错。示例如下:
//编译失败
class Grandfather{
int tag=0;
public Grandfather(int tag) {
this.tag = tag;
}
}
class Father extends Grandfather{
public Father() {
super(1);//去掉这一句,则默认调用基类无参构造函数,编译失败
System.out.println("father");
}
}
//1.1导出类会按照继承层次逐渐向上调用基类构造器,1.2然后按照声明顺序调用成员初始化方法,1.3最后调用导出类构造器主题;
class Grandfather{
int tag=0;
public Grandfather(int tag) {
System.out.println("ground father");
this.tag = tag;
}
}
class Father extends Grandfather{
public Father() {
super(1);
System.out.println("father");
}
}
class Son extends Father{
public Son() {
System.out.println("son");
}
}
public class Demo01 {
public static void main(String[] args) {
new Son();
}
}
output:
ground father
father
son
多态方法即导出类重写父类的方法:
示例如下:
class father{
public father() {
func();
}
void func(){ }
}
class son extends father{
int tag=1;
public son(int tag) {
// System.out.println("tag = "+tag);这里默认调用了父类的构造方法;
this.tag = tag;
System.out.println("tag = "+tag);
}
@Override
void func() {
System.out.println("tag = "+tag);
}
}
public class Demo02 {
public static void main(String[] args) {
new son(1);
}
}
output:
tag = 0//分配给对象的存储空间初始化为二进制的零;
tag = 1
由上述可知初始化的实际顺序为:
[注]
原文:https://www.cnblogs.com/dugk/p/8900808.html