2013-12-10 64 views
2

重写时会有什么执行流程?我相信的是,当我们调用任何类的构造函数/对象时,在执行时首先调用父构造函数而不是子进程。但在过度消除的情况下会发生什么? 让假设:Java执行流程?

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 

我不明白的是,为什么它的打印“在课堂上”而已,它应该是“在A级和,在类b“,
当我从类b中删除重写方法。它给了我想要的输出。

+0

请格式化你的代码 – david99world

回答

3

所有java方法都是虚拟的。这意味着使用实际类型这个调用该方法。因此,在构造函数A(){} 之内,这个是B的实例,所以这就是为什么你有它的方法调用。

2

这样调用printStatus()会调用同一个类的方法。如果你打电话给super.printStatus()它会从超类(你扩展的类)中调用方法。

2

当你超越一种方法时,你会完全超越它。原始实现的存在对其他类是完全不可见的(除了通过反射之外,这是它自己的一个重要话题,并且不是真正相关的)。只有你自己的类可以访问原始方法,那就是调用super.methodName()。

请注意,您的类可以在任何地方调用super.methodName(),而不仅仅是在重写函数中,尽管如果您希望超级实现和自己一样运行,最常用的用法是在重载函数中。

构造函数是一个稍微特殊的情况,因为有规则说明如何调用构造函数以及为什么要调用构造函数以确保在尝试在继承类中使用它时完全初始化超类。

1

super是总是调用是否写入super();或不。

在这个例子中,类A的printStatus()方法永远不会被调用。由于您正在创建B类的实例,因此将会覆盖方法。您可以使用以下方法调用Class A的printStatus()方法。

public B() 
{ 
    super.printStatus(); 
} 
0

当你重写的方法,它将覆盖你从A类

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(); } A类印刷方法和构造函数调用public A(){ printStatus(); } B类打印的方法,因为你覆盖。

但是它的错误与overridable method calls in constructors

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