【发布时间】:2017-05-23 01:44:43
【问题描述】:
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");
}
}
以上代码输出如下:
蜜蜂吧
昆虫 foo
小蜜蜂
注意在 Insect 的 foo() 方法中对 "this.bar()" 的调用实际上会返回并调用 Bee 的 bar() 方法(而不是调用 Insect 的 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 的第二个构造函数。
总之,method 调用返回子类,而 constructor 调用留在超类中。谁能解释一下为什么?
【问题讨论】:
-
因为方法可以被覆盖而构造函数不能。
-
JLS 8.8: "构造函数声明不是成员。它们永远不会被继承,因此不会被隐藏或覆盖"
-
你读过关于虚拟方法或虚拟调用的文章吗?
-
情况2不应该是编译错误吗?因为 Bee 类的构造函数上的 @Override
-
是的,应该的。
标签: java inheritance