繁体   English   中英

Java执行流程?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM