Java casting、overide和多态性
在下面的示例中,我认为这与运行时多态性有关,但我不明白为什么Java casting、overide和多态性,java,casting,polymorphism,overriding,typing,Java,Casting,Polymorphism,Overriding,Typing,在下面的示例中,我认为这与运行时多态性有关,但我不明白为什么y.m1(x)打印出A。我的理解是y.m1()调用类B中的m1()方法,因为y包含B的对象。由于x作为参数传递给它,并且它属于a类,比B更宽,它不会导致运行时错误吗?加上为什么z.m1(y)也打印出A 非常感谢 class A { public void m1(A a) { System.out.println("A"); } } class B extends A { publi
y.m1(x)
打印出A
。我的理解是y.m1()
调用类B
中的m1()
方法,因为y
包含B
的对象。由于x
作为参数传递给它,并且它属于a
类,比B
更宽,它不会导致运行时错误吗?加上为什么z.m1(y)
也打印出A
非常感谢
class A {
public void m1(A a) {
System.out.println("A");
}
}
class B extends A {
public void m1(B b) {
System.out.println("B");
}
}
class D2 {
public static void main(String[] args) {
A x = new A();
A y = new B();
B z = new B();
}
}
B
的m1
不会覆盖A
的m1
方法,因为它不采用相同的参数。因此B类由两个重载的m1
方法组成,一个取A
对象,另一个取B
对象。
这里只能使用静态多态性,这就是为什么您可以看到这种行为。对象的动态类型(新版本中使用的类型)是它的实际运行时类型:它定义了对象的实际方法 对象引用(变量)的静态类型是编译时类型:它定义或声明变量引用的对象可以调用哪些方法 因为动态类型和静态类型的参数类型都不同,所以动态类型不重写该方法,而是重载它
如果参数类型相同,则输出为B..使用@Override注释会有所帮助,这样编译器会告诉您是否无法重写任何内容。在这种情况下,A和B中的方法具有不同的参数类型,因此不存在重写。