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..");
    }
}

因此,当我们将父级引用用于子类对象时,我们无法使用该对象访问子类中的任何特定方法(父类中不存在)。