class C1
{public C1(){System.out.print("1");} }
class C2 extends C1
{public C2(){System.out.print("2");} }
class C3 extends C2
{public C3(){System.out.print("3");} }
class C4 extends C3
{public C4(){System.out.print("4");} }class s310041
{
public static void main(String [] args)
{ new C4 (); }
}为何输出是1234 ,有空的看下。这道题目的考点是什么? 考的哪方面的知识?
{public C1(){System.out.print("1");} }
class C2 extends C1
{public C2(){System.out.print("2");} }
class C3 extends C2
{public C3(){System.out.print("3");} }
class C4 extends C3
{public C4(){System.out.print("4");} }class s310041
{
public static void main(String [] args)
{ new C4 (); }
}为何输出是1234 ,有空的看下。这道题目的考点是什么? 考的哪方面的知识?
如果你把public的方法名改成其他就不会是1234了
记得给分哦,哈哈
当你的NEW C4的时候,C3是C4的父类,这时候,C4就拥有了C3的‘特征’,因而,你创建C4的时候,为了能得到C3的‘特征’,你就必须要调用C3的构成函数来得到C3的‘特征’,C3继承C2,C2继承C1也是类似的。
明白了把?
兄弟,examine u 构造方法拉,,see??
考继承方面知识拉
一般这种情况下,有继承关系时对象初始化是按以下顺序进行的:
(1) 子类的父类由高到低按顺序初始化静态成员,无论静态成员是否为private。
(2) 子类静态成员的初始化。
(3) 子类的父类由高到低进行默认构造方法的调用。注意,在调用每一个超类的默认构造
方法前,先进行对此超类进行非静态对象的初始化。
(4) 子类非静态成员的初始化。
(5) 调用子类的构造方法。这里我们可以把C4换一下
class C4 extends C3 {
static String str ;
public C4() {
System.out.print("4");
}
static{
System.out.println( str );
str = "C4:str";
System.out.println( str );
}
}那么输出的结果是:
null
C4:str
1234
super();
public C2();
只不过super()是自动调用的
另外还用到了super的用法,这方面书上面有,自己去看看