Java似乎与类构造函数和方法处理继承的方式不一致。
案例1 - 方法:
public class HelloWorld
{
public static void main(String[] args)
{
Bee b = new Bee();
b.foo();
}
}
class Insect {
public void foo() {
this.bar();
System.out.println("Insect foo");
}
public void bar() {
System.out.println("Insect bar");
}
}
class Bee extends Insect {
@Override
public void foo() {
super.foo();
System.out.println("Bee foo");
}
@Override
public void bar() {
System.out.println("Bee bar");
}
}
以上代码输出以下内容:
蜜蜂吧
Insect foo
Bee foo
请注意对" this.bar()"的调用在Insect的foo()方法实际上回过头来调用Bee的bar()方法(而不是调用Insect' s bar()方法)。
案例2 - 构造函数:
public class HelloWorld
{
public static void main(String[] args)
{
Bee i = new Bee(1);
}
}
class Insect {
public Insect(int size) {
this(size, 123);
System.out.println("Constructor: Insect size");
}
public Insect(int size, int height) {
System.out.println("Constructor: Insect size, height");
}
}
class Bee extends Insect {
public Bee(int size) {
super(size);
System.out.println("Constructor: Bee size");
}
public Bee(int size, int height) {
super(size, height);
System.out.println("Constructor: Bee size, height");
}
}
以上输出如下。
构造函数:昆虫大小,高度
构造函数:昆虫大小
构造函数:蜜蜂大小
注意调用" this(size,123);"在Insect的构造函数中,使用Insect的第二个构造函数而不是bee的第二个构造函数。
总而言之,方法调用返回子类,而构造函数调用保留在超类中。任何人都可以解释原因吗?
答案 0 :(得分:2)
除了关于方法的评论中的正确信息与构造函数不同之外 - 您实际上过度简化事情。
你知道,当你编写构造函数时,如果你打算使用"相同的类"那么你 决定。构造函数(当您使用this()
时) - 或者如果您想要调用超类构造函数(使用super()
)。这里没有中间立场 - 你必须明确这一点!
请记住:构造函数的职责是初始化相应类的对象。如果您在构造函数中调用this(whatever)
或super(whatever)
,则可能会产生巨大差异。
编译器无法知道您打算做什么。因此,您 要明确指出您想要调用的其他构造函数。
除此之外 - 让多态像这样启动是没有意义的。您绝对希望对象初始化在期望发生时发生。因为错误地初始化对象肯定会在之后创建问题。
使构造函数具有多态性的想法基本上意味着您在 runtime 确定要调用的构造函数。但是你已经知道你在X类,并且你必须初始化一个新的X对象。在这里允许多态性没有任何好处。相反 - 这样做会产生非常奇怪和奇怪的问题,而这些问题纯粹只是运行时的!