class classC extends classA
{
public classC()
{
System.out.println("C");
}
}
class classA
{
public classA()
{
System.out.println("A");
}
}
class classB extends classC
{
public classB()
{
System.out.println("B");
}
}
public class Test
{
public static void main(String args[])
{
System.out.println("Main");
classB c = new classB();
}
}
打印结果为:
Main
A
C
B
先是主函数能看明白,后面的为什么不是B而是A啊,就不懂了。有高手分析下。
因为构造函数如果第一跳条语句没有写this或super,系统会默认添加一天super()
分析:System.out.println("Main");
classB c = new classB();
首先输出打印 Main
然后创建一个B类对象,使用的是无参构造函数
public classB(){ System.out.println("B"); }
它的第一条语句不是this也不是指定的super,所以系统默认生成super();
执行super()找B的直接父类,super()没执行完后面的语句是不会运行,然后找到他的夫类C类,调用C类的无参构造函数,
public classC(){ System.out.println("C"); }
它的第一条语句也不是this和指定的super,所以系统默认生成super();执行super()找C的直接父类,调用A类的无参构造函数
public classA(){ System.out.println("A"); }
它的第一条语句也不是this和指定的super,所以系统默认生成super();执行super()找A的直接父类,A类无直接父类,默认继承了Object类
这里就就会完成A类的构造,输出A, A类执行完成后C类执行后续操作 输出C C构造完成后B类也执行后面操作 输出B
所以最终的打印结果是:
Main
A
C
B