为什么 Java 不允许从父构造函数创建子对象 [closed]

Why doesn't Java allow child object creation from parent constructor [closed]

提问人:Deeksha Aggarwal 提问时间:3/27/2017 最后编辑:Chris HamiltonDeeksha Aggarwal 更新时间:3/27/2017 访问量:484

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

6年前关闭。

class Human{
    public void eat()
    {
        System.out.println("Human is eating");
    }
}
class Boy extends Human{
    public void eat(){
        System.out.println("Boy is eating");
    }
    public static void main( String args[]) {
        Boy obj1 = new Human();
        //Here it shows incompatible types
    }
}

我是 java 的新手 - 谁能告诉我为什么在使用父构造函数时无法创建子类的上述对象?

爪哇岛

评论

14赞 Suresh Atta 3/27/2017
每个橙子都是水果,但不是每个水果都是橙子。
1赞 Suresh Atta 3/27/2017
好的,如果你想知道,这就是投反对票的原因。这个问题更适合 Google 而不是 SO。
1赞 Deeksha Aggarwal 3/27/2017
@ANS太棒了。现在请提供一些技术说明。
1赞 GhostCat 3/27/2017
@DeekshaAggarwal 你已经明白了。继承意味着 A IS-A B。你正在创造一个人类,并期望它成为一个男孩。
1赞 3/27/2017
让我们想象一下你的 Boy 类将有一个方法“showMaleGenitals()”,而你的 Human 类没有。如果您能够创建一个 Human,但将其声明为 Boy 并调用 obj.showMaleGenitals(),那么应该调用什么方法?因为实际的 Human 对象没有这种方法。“每个孩子都有父母的属性”<——它可能有更多,这就是问题所在。你不能说你想创建一个男孩,然后创建一个对象,这个对象可能缺少男孩类实际定义的很多内容。

答:

2赞 Dhrubajyoti Bhattacharjee 3/27/2017 #1

在你的例子中,Boy IS-A Human,所以你可以使用 Boy 的构造函数创建 Human。但是由于(根据 OOP)Human 不是 Boy,因此您不能创建 Boy 的实例来调用 Human 的构造函数。 因此,您不能直接使用 super 构造函数或父构造函数创建子实例。 男孩男孩 = new Human();不可能 人类 hm = new Boy();可能