【问题标题】:Java casting, overide and polymorphismJava 强制转换、覆盖和多态
【发布时间】:2014-09-13 22:10:41
【问题描述】:

在下面的示例中,我认为它与运行时多态性有关,但我不明白为什么 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();
        } 
  }

【问题讨论】:

  • 使用@Override 注释会有所帮助,这样编译器会告诉您是否未能覆盖任何内容。在这种情况下,A 和 B 中的方法具有不同的参数类型,因此没有覆盖。

标签: java casting polymorphism overriding typing


【解决方案1】:

Bm1 不会覆盖 Am1 方法,因为它不采用相同的参数。所以 B 类包含两个重载的m1 方法,一个采用A 对象,另一个采用B 对象。 此处只能使用静态多态性,这就是您可以看到这种行为的原因。

【讨论】:

    【解决方案2】:

    对象的动态类型(new 中使用的类型)是它的实际运行时类型:它定义了对象的实际方法。

    对象引用(变量)的静态类型是编译时类型:它定义,或者更确切地说,声明可以在变量引用的对象上调用哪些方法。

    因为动态类型和静态类型的参数类型不同,所以我们动态类型不是重写方法,而是重载方法。

    如果参数类型相同,则输出为 B...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 2015-02-16
      相关资源
      最近更新 更多