[英]Java execution flow?
在覆盖的情况下,执行流程是什么? 我相信,当我们调用任何类的构造函数/对象时,在执行期间首先调用父构造函数而不是子元素。 但是如果过度消除会发生什么? 让我们假设:
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中删除覆盖方法。 它给了我想要的输出。
所有java方法都是虚拟的。 这意味着该方法被称为利用实际类型的这一点 。 所以在构造函数A(){}中, 这是B的实例,所以这就是你调用它的方法。
像这样printStatus()
将从同一个类中调用该方法。 如果使用super.printStatus()
调用它将从超类(已扩展的类super.printStatus()
调用方法。
当你超越一种方法时,你会完全超越它。 原始实现的存在对于其他类是完全不可见的(除了通过反射,但这是它自己的一个重要主题而不是真正相关)。 只有您自己的类可以访问原始方法,即通过调用super.methodName()。
请注意,您的类可以在任何地方调用super.methodName(),而不仅仅是在重写函数中,尽管如果您希望超级实现与您自己的一样运行,则最常用的是在重写函数中。
构造函数是一个稍微特殊的情况,因为有关于如何以及为什么调用构造函数的规则,以确保在继承类中尝试使用它时确保超类完全初始化。
无论你是否写super(),都会调用super; 或不。
在示例中,将永远不会调用类A的printStatus()方法。 由于您正在创建B类的实例,因此将存在方法覆盖。 您可以使用以下方法调用Class A printStatus()方法。
public B()
{
super.printStatus();
}
覆盖方法时,它将覆盖您期望从A类中获取的方法。
应该使用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(); }
public B(){ super.printStatus(); }
调用一类打印方法和构造public A(){ printStatus(); }
public A(){ printStatus(); }
调用B类的打印方法,因为你覆盖。
但它在构造函数中的可覆盖方法调用是错误的。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.