1

我有以下代码,我不明白为什么这段代码的输出是:“high high”。在我看来,输出必须是:“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";
  }

}
4

2 回答 2

4

由于runNow()类中的方法Aprivate,它根本没有被覆盖。因此,输出符合预期。

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

于 2013-10-08T16:00:51.437 回答
3

private方法不能被覆盖。Java 语言规范 8.4.8.1中描述了这些规则。覆盖(通过实例方法)

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

  • C 是 A 的子类。

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

  • 任何一个:

    • m2 是公共的、受保护的或在与 C 相同的包中声明为具有默认访问权限,或
    • m1 覆盖方法 m3(m3 不同于 m1,m3 不同于 m2),这样 m3 会覆盖 m2。

当您在 in和 in 中声明一个runNow()方法时,您只是在创建一个新方法。尝试添加到他们的踢。你会得到一个编译器错误BC@Override

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

在你的 for 循环中

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

您正在调用runNow()声明为类型的变量,A并且由于您在A类中,因此您可以访问它们。这里不涉及多态性。

于 2013-10-08T16:03:03.747 回答