为什么我需要扩展抽象 class 中的另一个构造函数?
Why do I need another constructor in an extended abstract class?
我遇到过这个问题,我想知道这里有什么区别:
abstract class Abstract {
Abstract() {
System.out.println("Abstract.Abstract()");
}
Abstract(String s) {
System.out.println("Abstract.Abstract(String)");
}
void test() {
System.out.println("Abstract.test()");
}
void test(String s) {
System.out.println("Abstract.test(s)");
}
}
abstract class Base extends Abstract {
}
class Sub extends Base {
Sub(String s) {
super(s); // undefined constructor
}
void subTest(String s) {
super.test(s); // why is this all right then?
}
}
为什么我必须定义 Base(String s)
构造函数以使其可编译,但 super.test(s)
调用可以在不定义任何内容的情况下正常?
Java 为您提供 any class 中的默认构造函数(即使您没有自己定义),这意味着您有 Base()
class Base
中的默认构造函数,但不是任何其他构造函数(带参数的构造函数,例如 Base(String s)
) because constructors are not inherited 。
此外,扩展 class 通过继承为您提供其方法,因此在这里调用 super.test(s)
是合法的,因为 Base
具有从 [= 继承的方法 test(String s)
16=].
因为 Base
只定义了一个构造函数,no-args 默认调用超类 no-args 构造函数。
现在,Sub
可以使用哪些超类构造函数?就一个。
我遇到过这个问题,我想知道这里有什么区别:
abstract class Abstract {
Abstract() {
System.out.println("Abstract.Abstract()");
}
Abstract(String s) {
System.out.println("Abstract.Abstract(String)");
}
void test() {
System.out.println("Abstract.test()");
}
void test(String s) {
System.out.println("Abstract.test(s)");
}
}
abstract class Base extends Abstract {
}
class Sub extends Base {
Sub(String s) {
super(s); // undefined constructor
}
void subTest(String s) {
super.test(s); // why is this all right then?
}
}
为什么我必须定义 Base(String s)
构造函数以使其可编译,但 super.test(s)
调用可以在不定义任何内容的情况下正常?
Java 为您提供 any class 中的默认构造函数(即使您没有自己定义),这意味着您有 Base()
class Base
中的默认构造函数,但不是任何其他构造函数(带参数的构造函数,例如 Base(String s)
) because constructors are not inherited 。
此外,扩展 class 通过继承为您提供其方法,因此在这里调用 super.test(s)
是合法的,因为 Base
具有从 [= 继承的方法 test(String s)
16=].
因为 Base
只定义了一个构造函数,no-args 默认调用超类 no-args 构造函数。
现在,Sub
可以使用哪些超类构造函数?就一个。