0
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();

然后,它会打印出来——超类

调用的方法是否取决于调用该方法的实例?

4

6 回答 6

2

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

new Superclass().method1();  

输出是 -superclass
因为超类没有关于子类的任何信息。
& 你打电话时

new Subclass().method1();  

输出是 -subclass
因为当调用被覆盖的方法时,java 会根据调用时引用的对象的类型来确定要执行的方法版本。

于 2013-05-11T12:57:06.547 回答
1

这取决于调用什么对象方法。如果在父对象上调用该方法,则将调用父类方法,但如果在子对象上调用该方法,则将调用子类方法。如果方法没有被覆盖,那么总是会调用父类方法。

于 2013-05-11T09:21:45.523 回答
1

试图以更好的方式解释它,当一个函数说你method()在 中被覆盖并且你正在使用 的实例subclass调用时,对象不知道被覆盖并且它将运行自己的. 实际上,对 的任何更改对 .都是不可见的。因此, 的任何实例都无法访问被覆盖的。method()superclasssuperclassmethod()method()subclasssuperclasssuperclasssubclassmethod()

于 2013-05-11T10:13:49.673 回答
0

多态性。

可能你忘了这个

public class Subclass extends ParentClass{

除非你在子类中覆盖它只调用的方法parent method

new Superclass().method1();

这里我有超类实例所以超类 method1调用

如果你打电话

 new Subclass().method1();

subclasses过度 method1调用。

我想推荐这个教程以获得清晰的画面。

于 2013-05-11T09:20:44.190 回答
0

类必须扩展类:

public class Subclass extends SuperClass{

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

}

调用时调用SubClass().method()的优先级将是子类的方法,输出为

子类

但在这种情况下:

public class Subclass extends SuperClass{

    }

输出将是:

超类

于 2013-05-11T09:33:45.093 回答
0
public class SubClass extends SuperClass {
    @Override
    public void print() {
        System.out.println("SubClass");
    }

    public static void main(String[] args) {
        SuperClass obj = new SubClass();
        obj.print();
    }
}

class SuperClass {

    SuperClass() {
        print();
    }

    public void print() {
        System.out.println("SuperClass");
    }
}

上面的代码将打印:

SubClass
SubClass
SubClass

重要的是要记住,要执行的方法由 JVM 在运行时确定,基于实际对象的类型而不是其引用变量的类型。这里,当创建 SubClass 类的对象时,首先调用 SubClass 的默认构造函数,它调用 SuperClass 的构造函数。SuperClass 的构造函数依次调用 print()。这里,由于实际对象的类是SubClass,所以选择了SubClass的打印而不是SuperClass的打印。

于 2022-02-20T10:22:28.697 回答