我在Java覆盖方面有点混乱。假设我们有以下继承:
class A{
public A(){
}
void show(){
System.out.println("SuperClass");
}
}
class B extends A{
@Override
void show(){
System.out.println("SubClass");
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
b.show();
}
}
显然,class B
会覆盖show()
继承的方法class A
。为什么b.show();
不打印邮件System.out.println("SuperClass");
,因为class B
现在已经有来自show()
的方法class A
?
谢谢。
答案 0 :(得分:14)
B类的show
方法会覆盖A类的show方法而不会调用它,因此当您在{A}上调用System.out.println("SuperClass");
时,没有理由执行show
B的实例。
如果您将B级更改为:
class B extends A
{
@Override
void show(){
super.show ();
System.out.println("SubClass");
}
}
在B的实例上调用show
也将执行A
的show方法的逻辑。
答案 1 :(得分:3)
在课程B
中,您将重写,换句话说,替换 show()
方法的原始实现。每次在show()
对象上调用instanceof B
时,都会调用该方法的版本。
引用原始show()
方法的唯一方法是使用super.show()
内的B
语法或任何其他扩展A
的类来引用它。
另外需要注意的是,@Override
注释只是为了添加额外的编译器检查,但实际上不需要覆盖方法,只需要像以前那样重新实现它。 B
。
答案 2 :(得分:3)
它是多态性的问题,即对方法体的方法调用在运行时发生,即当JVM调用B b = new B()时;所以B对象是B类的类型,所以它显示B方法的方法被覆盖一个,如果你把super()放在B()的构造函数中,你可以得到父母一个。
答案 3 :(得分:2)
这是覆盖继承的效果。你只需要从超类中替换该方法(但你仍然可以到达旧类!)这里我也添加了一些多态性。希望这对你有所帮助。
class A{
public A(){
}
void show(){
System.out.println("SuperClass");
}
}
class B extends A{
void superclass() {
super.show();
}
@Override
void show(){
System.out.println("SubClass");
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
b.show(); //SubClass
b.superclass(); //SuperClass
A a = new A();
a.show(); //SuperClass
A c = new B();
c.show(); //SubClass
//c.superclass(); //error! the program won't compile
}
}