为什么这不会覆盖类构造函数?

时间:2013-02-05 10:01:26

标签: java

public class ExtAA extends AA {
   static int iTime;

   public static void main(String argv[]) {
       ExtAA d = new ExtAA();
       d.func(iTime);
   }

   public static void func(int iTime) {
      System.out.println(iTime);
   }

   public ExtAA() { }
}



class AA {
   public AA() { System.out.println("AA");  }
}

打印:

AA
0

我原本希望public ExtAA() { }覆盖AA的构造函数,因此不会打印AA,只需0。有人可以用什么方式解释我错了,如果我想覆盖构造函数怎么办?

P.S。我的问题完全有可能是愚蠢的,但我不知道公共ExtAA() {}应该或可以做什么。这是一个测试,我搞砸了,我想知道实际发生了什么(是的,我确实进入调试并逐步进行调试,我只是不知道为什么new ExtAA使用{{ 1}}而不是它自己定义的构造函数)

3 个答案:

答案 0 :(得分:5)

总是调用Java中超类的构造函数。你不能阻止它。如果有更多的构造函数,你可以控制它们被调用。

请考虑阅读一些Java的基础教程,这是Java OOP的基本内容。

隐式地,您的构造函数看起来像这样:

public ExtAA() {
    super(); // Constructor of super class call, always first line of code in child constructor
}

答案 1 :(得分:2)

想象一下,如果你可以从基础跳过构造函数。它可能使对象的父部分处于极不稳定的状态。

考虑基类在构造函数中进行某种有意义的初始化的情况。如果没有完成,那么突然你的对象的基类部分处于疯狂城镇。这几乎可以肯定Java决定像这样工作的原因。

作为一个非常简单的例子,假设您有一个扩展ArrayList的SortedArrayList类。如果SortedArrayList以某种方式没有调用任何ArrayList构造函数,你认为该对象的内部是否有意义?某处会有一个无效的数据结构,意味着事情会崩溃和燃烧。在某些情况下,覆盖构造函数可能是有意义的,但显然Java人员认为意外执行此操作的风险并不值得(并且非常在设计良好的类中很少有意义) graph - 如果子类在某种程度上不依赖于基类,那么为什么它以子类开头?)。

答案 2 :(得分:2)

对象具有自己的类的字段加上其父类的祖父类,祖父类的所有字段,一直到根类Object。有必要初始化所有字段,因此必须调用所有构造函数! Java编译器会在构造函数链接过程中自动插入必要的构造函数调用,或者您可以显式地执行它。