如果声明为
Human tom = new Athlete();
和Athlete
是Human
的子类,其对象类型是tom
?
对于tom.method1()
,两个类中都有一个method1()
,即Athlete.method1()
覆盖Human.method1()
,
我们使用哪个method1()
?是Athlete
类还是Human
类中的一个?
答案 0 :(得分:2)
tom
的实际类型是Athlete
。但是,由于tom
的声明指定了Human
,因此您只能访问在Human
(及其超类)上定义的方法。
如果Human
中的Athlete
中的方法被覆盖,例如method1()
,则称为Athlete
的实现。
如果您要声明tom
的类型为Athlete
(根据您评论中的问题),则tom
的实际类型不会改变。但是,您现在可以访问仅在Athlete
上定义的方法。
答案 1 :(得分:0)
该对象始终基于您创建它的类(并且您通过使用关键字new
创建一个对象)。在这种情况下,您将拥有一个Athlete
类的对象,该对象也将从method1()
中调用Athlete
,即使Human
拥有自己的方法版本。
如果method1
上没有Athlete
,那么您将从其超类中获取继承的方法。
答案 2 :(得分:0)
引用是父类型,而对象是子类型。
在这种情况下,引用只能看到子类的覆盖方法,父类中的其他方法和实例变量,而子类中的其他方法将不可见。
您可以在这里澄清 https://www.tutorialspoint.com/java/java_overriding.htm
答案 3 :(得分:0)
在此tom中是一种运动员对象。 Athlete.method1覆盖超类中的方法。如果Athlete类中没有方法,它将调用超方法