先看看这个简单的程序,很简单但是能说明我的问题了。
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()产生的。既然不能手动的输入,系统为什么能自己加入呢?

解决方案 »

  1.   

    this(0); 其实调用了public B(int i)
    {
    System.out.println("Class B TOO is"+i);
    } 这个构造方法,编译器会在这个方法的第一句加上super()
      

  2.   

    首先,A a=new A(); 调用A的构造函数
    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 
      

  3.   

    谢谢这个答案,这个是正解!我试过了。确实是this(0),这句调用
    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)上!