Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 转换为抽象类_Class_Methods_Call_Abstract - Fatal编程技术网

Class 转换为抽象类

Class 转换为抽象类,class,methods,call,abstract,Class,Methods,Call,Abstract,好的,我有一个抽象类: public abstract class Animal { public abstract String sound(); } 那么,我有一个类来扩展它: public class Chicken extends Animal { public String sound() { return "Cockadoodledoo!"; } } 然后,假设我有一个带有main方法的测试类: public class Test { Chic

好的,我有一个抽象类:

public abstract class Animal {
   public abstract String sound();
}
那么,我有一个类来扩展它:

public class Chicken extends Animal {
   public String sound() {
      return "Cockadoodledoo!";
   }
}
然后,假设我有一个带有main方法的测试类:

public class Test {
   Chicken a = new Chicken();
   System.out.println((Animal)a).sound());
}
输出是“Cockadoodledoo!”所以我的问题是,如果我将一种动物分类,为什么它仍然在鸡中调用该方法?难道它不会把一只猫看作是动物的对象吗?是因为sound()是抽象的,所以无法调用。。但这不会给我一个例外吗


提前感谢。

在内存中创建的对象仍然是
Chicken
类的实例。您通过强制转换所做的是将其视为
Animal
类的实例,这意味着您只能使用该类可用的方法和属性

因此,如果您的
Chicken
类有一个
LayEgg()
方法,例如,将其转换为
Animal
将意味着您无法调用该方法(除非您向后转换,因为它在机器内存中仍然是
Chicken
)。您仍然可以调用
Animal
可用的方法,其行为将是实例化的实际对象的行为

这和去完全一样:

Animal myAnimal = new Chicken();

超载了。你应该预料到这一点。在这种情况下,基本上你不能在
Animal
中调用
sound