我正在阅读的书中的文字总结如下
"从技术上讲,构造函数不能被覆盖,因为它们与当前类具有相同的名称.新的构造函数被创建而不是被继承.这个系统工作正常; ......"
我不明白的部分是他们这样说的时候:
"当调用类的构造方法时,也会调用所有超类具有相同签名的构造函数方法.因此,初始化可能发生在您继承的类的所有部分"
我不明白的是相同的签名部分....它对我来说就像所有构造函数必须具有相同的签名一样,然后当你初始化一个子类对象时,所有它的超类将被自动调用而不是必须为每个子类调用super(arg1,arg2)....这是他们所说的吗?
Tim*_*ote 10
那不太对劲.只有当它是默认构造函数(即无参数构造函数)时,才会自动调用超类的构造函数.
如果您的超类没有默认构造函数,那么您必须显式调用您选择的构造函数super(args..).
例如,尽管BearManPig构造函数具有不同的签名,但这完全没有问题Animal:
public class Animal {
public Animal() {
}
}
public class BearManPig extends Animal {
public BearManPig(String string) {
}
}
Run Code Online (Sandbox Code Playgroud)
那是因为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) {
}
}
Run Code Online (Sandbox Code Playgroud)
但这样做:
// 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
}
}
Run Code Online (Sandbox Code Playgroud)
当调用类的构造函数方法时,也会调用所有超类具有相同签名的构造函数方法。因此,您继承的类的所有部分都可以进行初始化
这是不正确的。首先,关于术语的说明:构造函数不是方法,因此术语“构造函数方法”没有任何意义。
虽然确实调用了超类构造函数,但它不需要具有相同的签名。如果子类构造函数以超类构造函数调用表达式开头,例如
class Student extends Person {
public Student(String name) {
super(name, Occupation.STUDENT);
}
}
Run Code Online (Sandbox Code Playgroud)
与调用中的参数计数和类型相匹配的超类构造函数。您完全可以自由地将哪些参数传递给该构造函数。
如果子类构造函数不以超级构造函数调用表达式开头,编译器将为您插入对超类的可访问零参数构造函数的调用,或者如果不存在此类构造函数,则会引发编译错误。
Sams 现在用 21 天自学 Java 2
您知道 Java 2 已经过时十年了吗?任何这么旧的书都会教你过时的东西,你最好尽快忘记。为什么不用一本更现代的书呢?