Java 在扩展类中使用多态性

Java 在扩展类中使用多态性,java,Java,我有一个下面的代码,我不明白为什么这个代码的输出是:“high high”。在我看来,输出必须是“低输出” 因为类A中的runNow()方法是private,所以它根本不被重写。因此,输出与预期一致 尝试在类B中的方法上添加@Override注释,您将看到编译器错误。因为类a中的runNow()方法是私有的,所以它根本不会被重写。因此,输出与预期一致 尝试在类B中的方法上添加@Override注释,您将看到编译器错误。

我有一个下面的代码,我不明白为什么这个代码的输出是:“high high”。在我看来,输出必须是“低输出”

因为类
A
中的
runNow()
方法是
private
,所以它根本不被重写。因此,输出与预期一致

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

因为类
a
中的
runNow()
方法是
私有的
,所以它根本不会被重写。因此,输出与预期一致


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

方法无法重写。这些规则在

类C中声明的实例方法m1重写另一个实例 方法m2,在类A iff中声明,以下所有条件均为真:

  • C是a的一个子类

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

  • 要么:

    • m2是公共的、受保护的或声明为默认访问的 包装为C,或
    • m1覆盖方法m3(m3不同于m1,m3不同于m2), 使m3超过m2
当您在
B
C
中声明
runNow()
方法时,您只是在创建一个新方法。尝试将
@Override
添加到它们中以进行踢腿。您将得到一个编译器错误

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

在您的for循环中

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

您正在对声明为类型
A
的变量调用
runNow()这里不涉及多态性。

私有
方法无法重写。这些规则在

类C中声明的实例方法m1重写另一个实例 方法m2,在类A iff中声明,以下所有条件均为真:

  • C是a的一个子类

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

  • 要么:

    • m2是公共的、受保护的或声明为默认访问的 包装为C,或
    • m1覆盖方法m3(m3不同于m1,m3不同于m2), 使m3超过m2
当您在
B
C
中声明
runNow()
方法时,您只是在创建一个新方法。尝试将
@Override
添加到它们中以进行踢腿。您将得到一个编译器错误

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

在您的for循环中

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

您正在对声明为类型
A
的变量调用
runNow()这里没有多态性。

但是如果类A中的runNow()是私有的,我怎么能从类A中调用“aa.runNow()”和runNow(),因为如果它是私有的,我不能调用这个方法,对吗?@user2776409你可以从该类中调用类的私有方法,
main()
A
中,但您不能覆盖该方法。试着把你的
main()
放在
C
上。哦,没错,我忘了这个细节。谢谢。我还有一个疑问:当我调用“aa.runNow()”(在对象B中)编译器搜索在类A中的第一个位置时?总是从超类开始,甚至从子类开始?例如:我正在调用“aa.runNow()”,所以编译器在类a中找到了一个runNow(),但是让我们看看子类中是否有另一个runNow(),没有,所以从类a中执行runNow()。对吗?@user2776409有点像。虽然对象是
B
,但声明的变量类型是
A
aaa
),因此
runNow()
方法是
A
中的方法。如果该方法是公共的,因此是继承的,那么由于多态性,您将看到您最初期望的
Low Out
。但是如果类A中的runNow()是私有的,我如何执行“aa.runNow()”并从类A中调用runNow(),因为如果这是私有的,我无法调用此方法,对吗?@user2776409您可以从该类中调用类的私有方法,
main()
位于
a
中,但您不能重写该方法。试着把你的
main()
放在
C
上。哦,没错,我忘了这个细节。谢谢。我还有一个疑问:当我调用“aa.runNow()”(在对象B中)编译器搜索在类A中的第一个位置时?总是从超类开始,甚至从子类开始?例如:我正在调用“aa.runNow()”,所以编译器在类a中找到了一个runNow(),但是让我们看看子类中是否有另一个runNow(),没有,所以从类a中执行runNow()。对吗?@user2776409有点像。虽然对象是
B
,但声明的变量类型是
A
aaa
),因此
runNow()
方法是
A
中的方法。如果该方法是公共的,因此是继承的,那么由于多态性,您将看到您最初期望的
Low Out