java Animal a = new Cat(); a.eat(); 向上转型后为什么调用的是a.eat()不是Animal的eat()
时间: 2024-04-27 19:24:59 浏览: 7
在Java中,当我们使用向上转型创建了一个子类对象的父类引用时,这个引用只能访问父类中存在的方法和属性,而不能访问子类中存在而父类中不存在的方法和属性。因此,当我们调用a.eat()时,实际上调用的是Cat类中的eat()方法,因为Cat类重写了Animal类中的eat()方法,并且Java中的方法调用是动态绑定的,即在运行时根据实际对象的类型来确定调用的方法。因此,即使是通过Animal类引用调用,也会调用Cat类中的eat()方法。
相关问题
package tzh; public class Animal { public void eat(){ System.out.println("Animal is eating"); } } class Cat extends Animal { public void meow() { System.out.println("Cat is meowing"); } Cat cat = new Cat(); Animal animal = (Animal) cat; animal.eat(); }检查并改错
在 Cat 类的定义中,应该将 Cat 类的实例化和方法调用放在方法中,而不是在类定义中。修改后的代码如下:
```
package tzh;
public class Animal {
public void eat() {
System.out.println("Animal is eating");
}
}
class Cat extends Animal {
public void meow() {
System.out.println("Cat is meowing");
}
public static void main(String[] args) {
Cat cat = new Cat();
Animal animal = cat;
animal.eat();
}
}
```
这样就可以正常编译和执行了。同时,注意将 Cat 类的实例化赋值给 Animal 类型的变量时,可以直接使用 `Animal animal = cat;`,无需进行强制类型转换。
请阅读下面的程序,写出运行结果,如果编译失败,写明失败原因。 abstract class Animal{ public final abstract void eat(); } class Cat extends Animal{ public void eat(){ System.out.println("cat...fish"); } } class CatDemo{ public static void main(String[] args){ Animal a = new Cat(); a.eat(); } } 填写答案
程序运行结果为:
```
cat...fish
```
这是因为Cat类继承了Animal抽象类,并实现了其抽象方法eat(),在CatDemo类中,创建了一个Animal类型的对象a,并将其引用指向了一个Cat对象,然后调用a的eat()方法,由于a指向的是Cat对象,所以最终调用的是Cat类中的eat()方法,输出了"cat...fish"。