Java中的多态性:为什么我们将父引用设置为子对象?
问题内容:
我想了解为子对象设置父引用的用例。示例:狗类扩展了动物类。(没有接口,介意)我通常会这样创建一个Dog对象:
Dog obj = new Dog();
现在,由于Dog是Animal的子类,因此它已经可以访问Animal的所有方法和变量。然后,这有什么区别:
Animal obj = new Dog();
请提供适当的用例及其使用代码段。请不要提供有关“多态性”或“接口编码”的理论文章!
码:
public class Polymorphism {
public static void main(String[] args){
Animal obj1 = new Dog();
Dog obj2 = new Dog();
obj1.shout(); //output is bark..
obj2.shout(); //output is bark..
}
}
class Animal{
public void shout(){
System.out.println("Parent animal's shout");
}
}
class Dog extends Animal{
public void shout(){
System.out.println("bark..");
}
}
class Lion extends Animal{
public void shout(){
System.out.println("roar..");
}
}
class Horse extends Animal{
public void shout(){
System.out.println("neigh");
}
}
两种情况下的输出是相同的。那么为什么我们将父引用设置为子对象呢?
问题答案:
好的。我想我得到了答案。
public class Polymorphism {
public static void main(String[] args){
Animal obj1 = new Horse();
Horse obj2 = new Horse();
obj1.shout(); //output is neigh..
obj2.shout(); //output is neigh..
obj1.winRaces(); /*But this is not allowed and throws compile time error,
even though the object is of Animal type.*/
}
}
class Animal{
public void shout(){
System.out.println("Parent animal's shout");
}
}
class Horse extends Animal{
public void shout(){
System.out.println("neigh..");
}
public void winRaces(){
System.out.println("won race..");
}
}
因此,当我们将父级引用用于子类对象时,我们无法使用该对象访问子类中的任何特定方法(父类中不存在)。