在覆盖的情况下执行的流程是什么?我相信,当我们调用任何类的构造函数/对象时,在执行期间首先调用父构造函数而不是子元素。但是如果过度消除会发生什么? 我们假设:
class A {
public A(){
printStatus();
}
public void printStatus(){
System.out.println("In Class A");
}
}
class B extends A{
public B(){
printStatus();
}
@Override
public void printStatus(){
System.out.println("In Class b");
}
}
public class Test2 {
public static void main(String[] args){
B b = new B();
}
}
此代码的输出是:
In Class b
In Class b
我不明白的是,为什么它只打印“In Class be”,它应该是“A级和B级”, 当我从类b中删除覆盖方法。它给了我想要的输出。
答案 0 :(得分:3)
所有java方法都是虚拟的。这意味着使用 this 的实际类型调用该方法。所以在构造函数A(){} 中,这个是B的实例,所以这就是你调用方法的原因。
答案 1 :(得分:2)
像这样调用printStatus()
将从同一个类调用该方法。如果你使用super.printStatus()
进行调用,它将从超类(已扩展的类)中调用方法。
答案 2 :(得分:2)
当你超越一种方法时,你会完全超越它。原始实现的存在对于其他类是完全不可见的(除了通过反射,但这是它自己的一个重要主题而不是真正相关)。只有您自己的类可以访问原始方法,即通过调用super.methodName()。
请注意,您的类可以在任何地方调用super.methodName(),而不仅仅是在重写函数中,尽管如果您希望超级实现与您自己的一样运行,则最常用的是覆盖函数。 / p>
构造函数是一个稍微特殊的情况,因为有一些关于如何以及为什么调用构造函数的规则,以确保在继承类中尝试使用它时确保超类完全初始化。
答案 3 :(得分:1)
super;或不。
在示例中,将永远不会调用类A的printStatus()方法。由于您正在创建B类的实例,因此将存在方法覆盖。您可以使用以下方法调用Class A printStatus()方法。
public B()
{
super.printStatus();
}
答案 4 :(得分:0)
当您覆盖某个方法时,它将覆盖您希望从A类中获得的方法。
答案 5 :(得分:0)
应该使用super
关键字来调用超类方法。
class A {
public A(){
printStatus();
}
public void printStatus(){
System.out.println("In Class A");
}
}
class B extends A{
public B(){
super.printStatus();
}
@Override
public void printStatus(){
System.out.println("In Class b");
}
}
构造函数public B(){ super.printStatus(); }
调用Class A打印方法,构造函数public A(){ printStatus(); }
调用Class B打印方法,因为你已经覆盖了。
答案 6 :(得分:0)
Try with like this :
class A {
public A(){
printStatus();
}
public void printStatus(){
System.out.println("In Class A");
}
}
class B extends A{
public B(){
super.printStatus();
printStatus();
}
@Override
public void printStatus(){
System.out.println("In Class b");
}
}
public class Test2 {
public static void main(String[] args){
B b = new B();
}
}
为了更好地理解重载和覆盖的概念,请浏览以下链接:
http://en.wikibooks.org/wiki/Java_Programming/Overloading_Methods_and_Constructors