0
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. 有人可以解释我错在什么地方,如果我想覆盖构造函数,我该怎么办?

PS 我的问题完全有可能是愚蠢的,但我不明白 public ExtAA(){ } 应该或可以做什么。这是在测试中,我搞砸了,我想知道实际发生了什么(是的,我确实进入调试并逐步检查它,我只是不知道为什么new ExtAA使用AA而不是它自己定义的构造函数)

4

3 回答 3

5

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

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

隐含地,您的构造函数如下所示:

public ExtAA() {
    super(); // Constructor of super class call, always first line of code in child constructor
}
于 2013-02-05T10:03:05.017 回答
2

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

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

作为一个非常简单的例子,想象一下如果你有一个扩展 ArrayList 的 SortedArrayList 类。如果 SortedArrayList 不知何故没有调用任何 ArrayList 构造函数,你认为对象的内部结构有意义吗?在某个地方会有一个无效的数据结构,这意味着事情会崩溃和燃烧。在某些情况下,重写构造函数可能是有意义的,但显然 Java 人认为不值得冒意外这样做的风险(而且在设计良好的类图中很少有意义——如果子类以某种方式不依赖于基类,那为什么要从子类开始呢?)。

于 2013-02-05T10:05:36.860 回答
2

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

于 2013-02-05T10:06:54.607 回答