Java执行流程?

时间:2013-12-10 11:13:01

标签: java inheritance override

在覆盖的情况下执行的流程是什么?我相信,当我们调用任何类的构造函数/对象时,在执行期间首先调用父构造函数而不是子元素。但是如果过度消除会发生什么? 我们假设:

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中删除覆盖方法。它给了我想要的输出。

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

像这样调用printStatus()将从同一个类调用该方法。如果你使用super.printStatus()进行调用,它将从超类(已扩展的类)中调用方法。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

无论你是写super(),都会调用

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打印方法,因为你已经覆盖了。

overridable method calls in constructors错了。

答案 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