当前位置: 首页 > 面试题库 >

声明子类的对象时,为什么调用超类的构造函数?(Java)

贺兴昌
2023-03-14
问题内容

考虑以下代码:

class Test {
    Test() {
        System.out.println("In constructor of Superclass");
    }

    int adds(int n1, int n2) {
        return(n1+n2);
    }

    void print(int sum) {
        System.out.println("the sums are " + sum);
    }
}


class Test1 extends Test {
    Test1(int n1, int n2) {
        System.out.println("In constructor of Subclass");
        int sum = this.adds(n1,n2);
        this.print(sum);
    }

    public static void main(String[] args) {
        Test1 a=new Test1(13,12);
        Test c=new Test1(15,14);
    }
}

如果我们在超类中有一个构造函数,那么我们为子类构造的每个对象(例如,a用于类Test1调用的对象Test1(int n1, int n2)及其父对象)都将调用它Test()

为什么会这样?

程序的输出为:

在超类的构造函数中

在子类的构造函数中

总和是25

在超类的构造函数中

在子类的构造函数中

总和是29


问题答案:

因为它将确保在调用构造函数时,它可以依赖于其超类中已初始化的所有字段。

请参阅此处的
3.4.4



 类似资料:
  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?

  • 问题内容: 我正在尝试创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。这是我正在使用的代码 在超类中,我用 我有一个访问器方法 我收到一个错误“ 味道在超类中具有私有访问权 ”,但是我认为这无关紧要,因为我正在调用将其返回到字段的访问器方法? 问题答案: 您应该做什么: 在您的超类中添加一个构造函数: 在Crisps类中: 注释 对您的问题的一些评论: “在超类中,我已经用”

  • 我见过子类的构造器方法被用于具有超类类型的变量。例如: 是类型对象还是类型?由于类inherit from,因此它的方法可能比它的超类多。实例调用这些函数是否只能存在于中,而不能存在于中?在这种情况下,和可以互换吗?例如:

  • 为什么第一个输出有柱线 = 空?是因为在创建类 B 之前调用了 B.foo() 吗?如果是,那么为什么可以调用 B.foo()?还是因为 B.foo() 中的字段栏试图从 A 获取柱线字段但无法访问它? 我的问题与链接的问题不同,我不是在问调用顺序,我是在问为什么第一个输出为空?另一个问题不是关于字段或空变量。 我不明白B.foo中的bar变量是如何为空的,如果它是在A和B中定义的。

  • 我目前正在学习Java的继承,我在理解它方面遇到了很大的困难,但是我不能理解的一个主要问题是为什么在下面的示例中有必要调用一个超类构造函数,它有什么帮助?此示例来自Oracle的方法教程。 我最初的想法是,会缩短当前构造函数中参数的代码,它只会接受父类中传入的值并将其添加到子类中(如下所示): 但是,正如我已经知道的那样,这是错误的,并且再次将我带到了真正做什么的问题上。我会非常感谢一些形式的解释