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中的方法具有不同的参数类型,因此不存在重写。