Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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_Polymorphism_Static Methods - Fatal编程技术网

我在理解Java同态时遇到了一些麻烦

我在理解Java同态时遇到了一些麻烦,java,polymorphism,static-methods,Java,Polymorphism,Static Methods,输出是 啊! BBBB 我想知道为什么?您调用了super.doY,这是B的超类a上的一个方法 所有的动物都会说话 猫是一种动物 猫会说话,会喝牛奶。你调用了super.doY,这是B的超类A上的一种方法 所有的动物都会说话 猫是一种动物 猫说话和喝牛奶。尽管XProcedure有两种名称相同的方法-doX,但两种签名是不同的。第一个方法获取类A的实例作为参数,第二个方法获取类B的实例 调用XProcedure.doX(this)时,将根据传递参数的类调用正确的方法 打印“AAAA!”是因为su

输出是

啊! BBBB


我想知道为什么?

您调用了
super.doY
,这是B的超类a上的一个方法

所有的动物都会说话

猫是一种动物


猫会说话,会喝牛奶。

你调用了
super.doY
,这是B的超类A上的一种方法

所有的动物都会说话

猫是一种动物


猫说话和喝牛奶。

尽管XProcedure有两种名称相同的方法-doX,但两种签名是不同的。第一个方法获取类A的实例作为参数,第二个方法获取类B的实例

调用
XProcedure.doX(this)
时,将根据传递参数的类调用正确的方法

打印“AAAA!”是因为
super.doY()
调用。
打印“BBBB!”是因为
XProcedure.doX(这个)呼叫


在A的构造函数中不同于B的构造函数中的
,原因在于Che的回答中。尽管A的构造函数是从B的构造函数中调用的,但在A的范围内,实例属于类A。

尽管XProcedure有两个同名的方法-doX,但两个签名是不同的。第一个方法获取类A的实例作为参数,第二个方法获取类B的实例

调用
XProcedure.doX(this)
时,将根据传递参数的类调用正确的方法

打印“AAAA!”是因为
super.doY()
调用。
打印“BBBB!”是因为
XProcedure.doX(这个)呼叫


在A的构造函数中不同于B的构造函数中的
,原因在于Che的回答中。尽管A的构造函数是从B的构造函数中调用的,但在A的作用域中,实例属于A类。

关键点是,要调用的重载doX方法是在编译时根据声明的变量类型选择的。不在运行时基于变量的具体类型。在方法A.doY中,“this”的声明类型是A,因此调用第一个doX方法。在方法B.doY中,“this”的声明类型是B,因此调用第二个doX方法。在运行时,这两个方法中的具体类型都是B,但要调用的方法的选择是在编译时进行的,因此其具体类型无关紧要。关键是要调用的重载doX方法是在编译时根据变量的声明类型选择的。不在运行时基于变量的具体类型。在方法A.doY中,“this”的声明类型是A,因此调用第一个doX方法。在方法B.doY中,“this”的声明类型是B,因此调用第二个doX方法。在运行时,这两个方法中的具体类型都是B,但选择要调用的方法是在编译时进行的,因此其具体类型无关紧要。
public class XXX {

    @Test
    public void test() {
        B b = new B();
        b.doY();
    }
}



class A {
    public void doY() {
        XProcedure.doX(this);
    }
}


class B extends A {

    public void doY() {
        super.doY();
        XProcedure.doX(this);
    }
}


class XProcedure {

    public static void doX(A a) {
        System.out.println("AAAA!");
    }

    public static void doX(B b) {
        System.out.println("BBBB!");
    }
}