先看看这个简单的程序,很简单但是能说明我的问题了。
public class ShadowTest {
public static void main(String argv[])
{
A a=new A();
B b=new B();
}
}class A
{
int i=10;
public A()
{
System.out.println("Class A is "+i);
}
public A(int i)
{
System.out.println("Class A TOO is"+i);
}
}class B extends A
{
public B()
{
this(0);
System.out.println("Class B is "+i);
}
public B(int i)
{
System.out.println("Class B TOO is"+i);
}
}这里就是class B的构造函数里我有点乱了,首先的构造函数B(),书上说要是没有显式的写出super(),则系统自动会加上super()。但是this()这时候也用的时候写super(),肯定是错误的,这点我知道。因为它们两都必须写在构造函数里的第一行!但是执行的结果很让我以外,系统好像自己加上了super();请看输出:
Class A is 10
Class A is 10
Class B TOO is0
Class B is 10第二列的Class A is 10,照我看的话应该是super()产生的。既然不能手动的输入,系统为什么能自己加入呢?
public class ShadowTest {
public static void main(String argv[])
{
A a=new A();
B b=new B();
}
}class A
{
int i=10;
public A()
{
System.out.println("Class A is "+i);
}
public A(int i)
{
System.out.println("Class A TOO is"+i);
}
}class B extends A
{
public B()
{
this(0);
System.out.println("Class B is "+i);
}
public B(int i)
{
System.out.println("Class B TOO is"+i);
}
}这里就是class B的构造函数里我有点乱了,首先的构造函数B(),书上说要是没有显式的写出super(),则系统自动会加上super()。但是this()这时候也用的时候写super(),肯定是错误的,这点我知道。因为它们两都必须写在构造函数里的第一行!但是执行的结果很让我以外,系统好像自己加上了super();请看输出:
Class A is 10
Class A is 10
Class B TOO is0
Class B is 10第二列的Class A is 10,照我看的话应该是super()产生的。既然不能手动的输入,系统为什么能自己加入呢?
{
System.out.println("Class B TOO is"+i);
} 这个构造方法,编译器会在这个方法的第一句加上super()
public A()
{
System.out.println("Class A is "+i);
}
输出Class A is 10B b=new B();
则先调用B的构造函数
public B()
{
this(0);
System.out.println("Class B is "+i);
}
这个构造函数
里先隐式调用了其基类的构造函数
public A(int i)
{
System.out.println("Class A TOO is"+i);
}
输出Class A is 10
再执行第一句this(0);调用另一个构造函数
public B(int i)
{
System.out.println("Class B TOO is"+i);
}
再执行System.out.println("Class B TOO is"+i);
输出Class B TOO is0
最后返回无参构造函数接着执行this(0);后面的语句:System.out.println("Class B is "+i);
输出Class B is 10
public B(int i)
{
System.out.println("Class B TOO is"+i);
} 这个构造方法,然后在编译时候在这个方法的第一句加上super()。
因为我把父类的无参数构造函数删除掉的时候执行编译出错Exception in thread "main" java.lang.Error: 无法解析的编译问题:
未定义隐式超构造函数 A()。必须显式调用另一个构造函数 at B.<init>(B.java:10)
at B.<init>(B.java:7)
at ShadowTest.main(ShadowTest.java:6)
且错误就出现在public B(int i)上!