Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在动态分派的情况下,如何调用重写的方法_Java - Fatal编程技术网

Java 在动态分派的情况下,如何调用重写的方法

Java 在动态分派的情况下,如何调用重写的方法,java,Java,Whats是它检查调用哪个方法的优先级。当我使用动态分派时,JVM如何决定调用哪个方法,我感到困惑。本例中的输出是 class a extends b { void h() { System.out.println("class a"); } public static void main(String[]args) { b x = new a(); c y = new b(); c z = new a();

Whats是它检查调用哪个方法的优先级。当我使用动态分派时,JVM如何决定调用哪个方法,我感到困惑。本例中的输出是

class a extends b {
    void h() {
        System.out.println("class a");
    }
    public static void main(String[]args) {
        b x = new a();
        c y = new b();
        c z = new a();

        x.h();      //output class a
        y.h();      //output class b
        z.h();      //output class a
    }
}

class b extends c {
    void h() {
        System.out.println("class b");
    }
}
class c {
    void h() {
        System.out.println("class c");
    }
}
当我从类a中删除重写的方法时,输出是

class a
class b
class a

使用的类取决于实例化的类型。因此,如果您有一个类a的实例(通过新的a()),那么声明的变量是类型a、b还是c对于调用h()定义的目的并不重要(它将始终调用a.h()


但是,声明的类型起作用的地方在于选择重载方法时。如果有一个子类重载重写的方法,那么当从声明为父类的变量调用时,将永远不会使用重载的方法。如果使用声明为属于子类的变量,那么它将根据需要使用重载方法。

能否请您稍微整理一下间距?此代码不编译-
bx=new a()
是非法的。好吧,让我检查一下我刚从eclipse复制粘贴的代码…当我在父类类型对象中存储子类引用时,它没有考虑对象类型吗:-o。。。我认为在动态分派过程中,他们会根据对象类型调用方法。感谢您指出,无论声明的类型是什么(假设该方法存在于声明的类型中),您都将始终调用实例化类型的方法(该方法可能会被继承或重写,也可能不会被继承或重写)。但是,如果方法在子类型中重载,则对象的声明类型将起作用(从声明为父类型的实例调用将不会使用重载方法,而如果对象声明为子类型,则将使用重载方法)。
class b
class b
class b