什么是超类构造函数实际指的是什么?该类的类或对象(或两者都没有?)

时间:2016-04-05 01:59:33

标签: java class inheritance constructor superclass

我确定这会成为一个愚蠢的问题,但有人可以用Java告诉我(虽然我确定这必须与其他语言有一些相关性),超类构造函数是什么实际上在做什么?

假设我有一个带有构造函数的父类,该构造函数从给定构造函数的参数中设置变量(不一定是静态变量),然后在子类的构造函数中调用超类构造函数。如果我还没有实例化父类(虽然它有相同的内容),那么超类构造函数实际指的是什么(类本身或它本身不存在的对象?),以及它设置的变量实际上已经设置在哪里? 当一个超类构造函数能够改变不是静态的变量时,它肯定是别的东西吗?如果它改变了一个非静态变量,但该类从未实例化,那么该变量的值会发生什么变化?如何访问它等等?

很抱歉,如果这很难理解,但希望有人可以解释一下吗?而且,我相信这将成为一个愚蠢的问题。

由于

2 个答案:

答案 0 :(得分:2)

当构造函数运行时,对象的一个​​实例已经被分配,但是它没有被正确初始化(毕竟这是构造函数的作用)。

因此,在构造函数中,您可以访问当前实例(this),但在构造函数完成之前,请小心处理。

例如,如果constructor calls into non-final methods(稍后可能会被覆盖),这可能会成为一个问题。

类似地,super将引用超类实例(并且Java确保您在构造函数中执行的第一件事是调用其中一个super构造函数,以便在您自己的构造函数中调用构造函数代码启动,继承的字段全部初始化。)

如果您的父类需要将参数传递给构造函数,那么所有子类构造函数都必须提供该参数作为第一行代码。编译器不会接受无法执行此操作的子类。

答案 1 :(得分:0)

If I haven't ever instantiated the parent class (although it's the same if I have), what is that superclass constructor actually referring to (the class itself or a non-existent object of it?)这不会发生。 (我相信你说的是你没有调用任何父类的构造函数,对吗?)

将始终调用父级的构造函数,但通常不会显式调用。每当你有一个子类,并且在它的构造函数中你没有明确地调用父类'构造函数(通过使用super(...),编译器将默默地帮助您调用父类的无参数构造函数。

即。

class Parent {
  int parentVar = 0;
  public Parent() {
    parentVar = 1;
  }
}

class Child extends Parent {
  int childVar;
  public Child() {
    childVar = 10;
  }
}

虽然您未在Parent中调用Child()的构造函数,但编译器隐含地帮助您在{的第一行添加一行super() {1}}构造函数,因此它实际上在做:

Child

因此,当您实例化 public Child() { super(); childVar = 10; } 时,您会看到parentVar设置为1

相关问题