今天看到一道面试题:

父类:

package test;
public class FatherClass
{
public FatherClass()
{
System.out.println("FatherClass Create");
}
} 

 

子类: 

package test;
import test.FatherClass;
public class ChildClass extends FatherClass
{
public ChildClass()
{
System.out.println("ChildClass Create");
}
public static void main(String[] args)
{
FatherClass fc = new FatherClass();
ChildClass cc = new ChildClass();
}
} 

请问输出的结果是什么?

答案

FatherClass Create
FatherClass Create
ChildClass Create

这道题考察的是关于子类继承父类代码执行顺序的问题
首先,创建一个对象,就要调用其构造方法,来初始化成员函数和成员变量。子类拥有父类的成员变量和成员方法,所以子类必须调用父类的构造方法,否则从父类继承过来的成员变量和成员方法得不到正确的初始化。子类对象在创建时默认调用父类的无参数的构造方法,此调用子类不必显式写出来,但是如果父类中没有无参的构造方法,则必须在子类的构造方法中的第一句调用父类有参的构造方法 ,并且要把参数传递给父类的构造方法。

如:

父类:

public class Father
{

public Father(int i)
{
System.out.println("有参数的:FatherClass Create");
}


} 

*父类中没有提供无参构造方法

子类:

public class Child extends Father
{
public Child()
{
    super(5);//这里必须是子类构造方法的第一行,否则编译报错
System.out.println("ChildClass Create");
}
public static void main(String[] args)
{
Father fc = new Father(2);
Child cc = new Child();

}
} 

这时输出:

有参数的:FatherClass Create
有参数的:FatherClass Create
ChildClass Create
01-13 00:45
查看更多