在扩展类中使用多态

时间:2013-10-08 15:59:08

标签: java

我有以下代码,我不明白为什么这段代码的输出是:“高高”。在我看来,输出必须是:“Low Out”

public class A{

  private String runNow(){
    return "High";
  }

  static class B extends A{
    public String runNow(){
      return "Low";
    }
  }

  public static void main(String args[]){
    A[] a=new B[]{new B(),new C()};
    for(A aa:a)
      System.out.print(aa.runNow()+" ");
  }

}

class C extends A.B{

  public String runNow(){
    return "Out";
  }

}

2 个答案:

答案 0 :(得分:4)

由于班级runNow()中的A方法为private,因此根本不会覆盖它。因此,输出符合预期。

尝试在类@Override中的方法上添加B注释,您将看到编译器错误。

答案 1 :(得分:3)

private方法无法覆盖。规则在Java Language Specification 8.4.8.1. Overriding (by Instance Methods)

中描述
  

在类C中声明的实例方法m1会覆盖另一个实例   方法m2,在A类中声明如果满足以下所有条件:

     
      
  • C是A的子类。

  •   
  • m1的签名是m2签名的子签名(§8.4.2)。

  •   
  • 或者:

         
        
    • m2 公开,受保护或声明为默认访问权限   打包为C,或
    •   
    • m1覆盖方法m3(m3与m1不同,m3与m2不同),   这样m3就会覆盖m2。
    •   
  •   

当您在runNow()B中声明C方法时,您只是在创建一种新方法。尝试将@Override添加到其中以进行踢腿。您将收到编译器错误

  

A.B类型的runNow()方法必须覆盖或实现超类型   方法

在你的for循环中

for(A aa:a)
    System.out.print(aa.runNow()+" ");

您正在对声明为runNow()类型的变量调用A,因为您在A类中,您可以访问它们。 这里没有涉及多态性。