我在理解Java同态时遇到了一些麻烦
输出是 啊! BBBB我在理解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
我想知道为什么?您调用了
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!");
}
}