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啊,就不懂了。有高手分析下。 作者: pphdsny3 时间: 2012-8-2 11:29
给你看看这些代码,看明白了,你也就懂了
package com.hf.scjp.constructor;
public class Parent1 {
public static StaticTest stat=new StaticTest(1L);
static {
System.out.println("in parent1 static code …… ");
}
public Parent1(){
System.out.println("in parent1 constructor …… ");
}
}
package com.hf.scjp.constructor;
public class Son1 extends Parent1 {
public static StaticTest stat=new StaticTest(1);
static {
System.out.println("in Son1 static code …… ");
}
public Son1(){
System.out.println("in Son1 constructor …… ");
}
public Son1(int s){
System.out.println("in Son1 constructor with param: int");
在输出main后 最后输出结果由上往下是ACB
作者: 黑马黄宏强 时间: 2012-8-2 14:47
因为构造函数如果第一跳条语句没有写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