示例程序:
class Animal {
public void eat() {
System.out.println(" Animal eats");
}
class Dog extends Animal {
public void eat(String s) {
System.out.println(" Dog eats" + s);
}
public class Demo {
public static void main(String args[]){
Animal a = new Dog();
Dog d = (Dog) a;
a.eat();
d.eat("Meat");
}
}
我的问题是为什么a.eat("Meat")
无法访问?由于a
在引用Dog Object期间是Object,因此应该允许调用eat("meat")
。
任何人都可以澄清我哪里出错了吗?
答案 0 :(得分:2)
您尝试通过基类Press S to stop.'A'
Pass # 0
Pass # 1
Pass # 2
'B'
Pass # 3
Pass # 4
Pass # 5
etc.
的变量调用子类Dog
的方法。
Java具有强类型,因此如果声明类Animal
的变量,则只能访问Animal及其超类的方法和字段。
您可以使用强制转换Animal
从动物中调用eat("Meat")
,但您应该尽可能避免使用此类构造。
顺便说一句,你的方法看起来像是一个函数重载而不是多态。
P.S。关于强打字的this article可能会对您有所帮助。并且this one关于重载和多态之间的区别。
答案 1 :(得分:0)
Dog d = (Dog) a;
您要将Animal a
投射到Dog
。但是,这不会更改a
的类型。 a
仍为Animal
,因此您只能在没有字符串的情况下调用eat()
。