教科书的覆盖构造函数部分没有意义



我正在阅读的书中的文字总结

"从技术上讲,构造函数不能被覆盖,因为它们与当前类具有相同的名称。将创建新的构造函数,而不是继承构造函数。这个系统工作正常;..."

我不明白的部分是当他们这样说时:

"当你的类的

构造方法被调用时,所有超类具有相同签名的构造函数方法也被调用。因此,初始化可以发生在你继承的类的所有部分。

我不明白的是相同的签名部分....在我看来,好像所有的构造函数都必须具有相同的签名,然后当你初始化一个子类对象时,它的所有超类都会被自动调用,而不必为每个子类调用super(arg1,arg2)。这是他们所说的吗?

这不太对。 仅当超类的构造函数是默认构造函数(即 no-arg 构造函数)时,才会自动调用超类的构造函数。

如果您的超类没有默认构造函数,则必须使用 super(args..) 显式调用您选择的构造函数。

例如,尽管BearManPig的构造函数与Animal的签名不同,但这完全没问题:

public class Animal {
  public Animal() {
  }
}
public class BearManPig extends Animal {
  public BearManPig(String string) {
  }
}

那是因为有一个Java找到了默认的no-arg构造函数。

现在,当没有默认构造函数时,您必须明确要调用哪个构造函数。 例如,这不起作用

// DOESN'T COMPILE
public class Animal {
  public Animal(String string) {
  }
  public Animal(String string0, String string1) {
  }
}
public class BearManPig extends Animal {
   // There is no default constructor, stupid Java can't figure out what to do
  public BearManPig(String string) {
  }
}

但这确实:

// does compile
public class Animal {
  public Animal(String string) {
  }
  public Animal(String string0, String string1) {
  }
}
public class BearManPig extends Animal {
  public BearManPig(String string) {
    super(string); // I've told Java what to do
  }
}

所有超类不需要具有相同的构造函数签名。
创建新对象时,如果未定义构造函数,则 Java 不会调用超类的参数构造函数。如果未定义任何其他构造函数,则 Java 不提供参数构造函数。
如果你定义了任何其他构造函数,你必须在子类构造函数中调用它(在第一行)。
这可能会有所帮助。

调用类

的构造器方法时,还会调用所有超类具有相同签名的构造函数方法。因此,可以对继承的类的所有部分进行初始化

这是不正确的。首先,关于术语的说明:构造函数不是方法,因此术语"构造函数方法"没有任何意义。

虽然确实调用了超类构造函数,但它不需要具有相同的签名。如果子类构造函数以超类构造函数调用表达式开头,例如

class Student extends Person {
    public Student(String name) {
        super(name, Occupation.STUDENT);
    }
}

与调用的参数计数和类型匹配的超类构造函数。您完全可以自由地将哪些参数传递给该构造函数。

如果子类构造函数

不是以超构造函数调用表达式开头,编译器将为您插入对超类的可访问零参数构造函数的调用 - 如果没有此类构造函数,则会引发编译错误。

Sams 现在在 21 天内自学 Java 2

你知道Java 2已经过时了十年吗?任何一本这么旧的书都会教你过时的东西,你最好快点忘记。为什么不使用更现代的书呢?

最新更新