什么决定了覆盖方法的调用

时间:2013-05-11 09:19:34

标签: java override

public class Superclass{

    void method1(){
        method0();
    }

    void method0(){
        System.out.println("superclass"); 
    }

}



public class Subclass extends Superclass{

    void method0(){
        System.out.println("subclass");
    }

}


public class Runclass{

    public static void main(String[] args){
        new Subclass().method1();
    }

}

此代码打印出来 - 子类。

让它说是

new Superclass().method1();

然后,它将打印出来 - 超类

是调用方法的实例调用依赖方法吗?

5 个答案:

答案 0 :(得分:2)

它是Dynamic Method Dispatch(运行时多态)的一个例子 在Dynamic方法中,在运行时解析被重写方法的调度 当你打电话

new Superclass().method1();  

输出为 - superclass
因为Superclass没有关于子类的任何信息 &安培;当你打电话

new Subclass().method1();  

输出为 - subclass
因为调用重写方法时,java会根据调用时引用的对象类型确定要执行的方法版本。

答案 1 :(得分:1)

这取决于调用的对象方法。如果在父对象上调用该方法,则将调用parents方法,但如果在子对象上调用该方法,则将调用子类方法。如果不覆盖方法,那么将始终调用父类方法。

答案 2 :(得分:1)

尝试以更好的方式解释它,当一个函数,在method()中覆盖您的subclass并且您使用{{1}的实例调用method()时} superclass对象不知道被覆盖的superclass,它将运行自己的method()版本。事实上,method()subclass所做的任何更改都是superclass不可见的。因此,superclass的任何实例都无法访问subclass被覆盖的method() {{1}} 1}}。

答案 3 :(得分:0)

<强>多态性。

可能你忘了这个

public class Subclass extends ParentClass{

除非你在子类中使用该方法,否则它只调用parent method

new Superclass().method1();

这里我的超类实例就是超类method1调用

如果你打电话

 new Subclass().method1();

subclasses已经过了method1次来电。

我想建议tutorial以获得清晰的图片。

答案 4 :(得分:0)

Sub 类必须扩展 Super 类:

public class Subclass extends SuperClass{

    void method0(){
        System.out.println("subclass");
    }

}

当调用SubClass().method()时,调用的优先级将是subClass的方法,输出是

  

子类

但在这种情况下:

public class Subclass extends SuperClass{

    }

输出将是: