使用Child类Reference创建Parent类的实例

时间:2014-04-18 06:01:38

标签: java inheritance

为什么我们不能使用Child类Reference指向Parent类对象。

class Abc
{
    public void Message()
    {
        System.out.println("Abc");  
    }
}

class pqr extends Abc
{
    public void Message()
    {
        System.out.println("pqr");  
    }   
}

class test1
{
    public static void main (String [] ars)
    {
        Abc a = new Abc();  
        a.Message();
        Abc b = new pqr();
        b.Message();
        pqr c = new pqr();
        c.Message();
        //pqr d =  new Abc();
    }
}

所以我的问题是如果Abc b = new pqr();是可能的,那么为什么不pqr d = new Abc();(因为pqr是一个子类,它将具有父类的所有功能。)

我只是想检查一下我是在做d.Message()它将打印的内容是父类方法还是子类方法。

由于

2 个答案:

答案 0 :(得分:9)

简单,每只狼都是动物,但不是每只动物都是狼。

因此Abc b = new pqr()有效,但pqr d = new Abc()无效。

答案 1 :(得分:1)

用简单的语言解释,父母创造孩子(或生孩子)孩子不要创造父母。由于OOP从现实世界实体中获取概念,因此孩子创建其父项是错误的。

现在变得技术化了。在编译时,JAVA通过引用变量的类型而不是实际对象来调用对象的方法和属性。实际对象只能在运行时知道。因此,假设您在Class Pqr中有一个方法(请习惯使用类名称的大写字符)public void sayHello()。 Pqr类扩展了Abc。现在,如果Java允许使用子引用创建父对象,那么您将以这种方式创建对象

Pqr d = new Abc()

现在因为d的类型是Pqr,所以在调用时

d.sayHello() 

编译器会认为你是从类Pqr调用方法。但是在你的实际对象Abc的运行时,没有sayHello()。它会崩溃。因此,在编译时本身不允许使用子引用创建父对象。我希望这可以解除你的怀疑。