java类声明对象类型不明确
如果有声明
Human tom = new Athlete();
而Athlete
是Human
的一个子类,哪个对象类型是tom
对于tom.method1()
,两个类中都有一个method1()
,即Athlete.method1()
覆盖Human.method1()
我们使用哪个method1()
?是来自Athlete
类还是来自Human
类
你可以在下面搜索框中键入要查询的问题!
如果有声明
Human tom = new Athlete();
而Athlete
是Human
的一个子类,哪个对象类型是tom
对于tom.method1()
,两个类中都有一个method1()
,即Athlete.method1()
覆盖Human.method1()
我们使用哪个method1()
?是来自Athlete
类还是来自Human
类
# 1 楼答案
tom
的实际类型是Athlete
。但是,由于tom
的声明指定了Human
,因此只能访问Human
(及其超类)上定义的方法如果
Human
上的方法在Athlete
中被重写,例如method1()
,那么Athlete
上的实现就是被调用的实现如果您将
tom
声明为Athlete
类型(根据您评论中的问题),那么tom
的实际类型不会改变。但是,您现在可以访问仅在Athlete
上定义的方法# 2 楼答案
在这种情况下,汤姆是一种运动员对象。运动员method1重写了超类中的方法。如果在运动员课程中没有方法,那么它将调用super方法
# 3 楼答案
引用是父类型,但对象是子类型
在这种情况下,只有子类的重写方法、父类中的其他方法和实例变量对引用可见,而子类中的其他方法将不可见
你可以在这里得到澄清 https://www.tutorialspoint.com/java/java_overriding.htm
# 4 楼答案
对象总是基于您创建它的类(并且您使用关键字
new
创建对象)。在本例中,您将有一个Athlete
类的对象,它也将从Athlete
调用method1()
,即使Human
有自己的方法版本如果
Athlete
上没有method1
,那么您将从其超类中获得继承的方法