Java对象实例化

时间:2017-02-20 05:01:48

标签: java

这是一个非常简单的问题,但无法在SO上找到准确的答案,任何人都能解释当我声明一个变量时内存中会发生什么:

Animal obj= new Horse();

如果你看到上面的声明类型(Animal)对象是不同的并且初始化(Horse)。场景背后会发生什么。

4 个答案:

答案 0 :(得分:1)

动物obj =新马();

你正在构建一个可以完成马或动物工作的物体obj。 马是从动物遗传的。这样您就可以访问Animal的所有属性和方法。

在这里找到了 这是多态的基础:想象一下,你有几个继承自父类的子类。您希望通过父类中定义的接口/方法使用所有这些子类,而不必担心每个子类中的实现细节(每个子类可能做不同的事情,但具有相同的整体语义)。

这是可能的,因为子类与其父类具有IS-A关系,因为子类继承自父类。

我建议你学习继承&多态性:

答案 1 :(得分:1)

当您使用new关键字时,您将创建一个对象。对象在堆中创建。 new Horse()将在堆中创建Horse的对象,并根据类Horse.java进行初始化。

现在假设Horse继承自Animal而提交的案例。通过类型为HorseAnimal)的变量引用Animal a = new Horse()的对象不会影响对象创建(即使您执行Horse h = new Horse()也会创建相同的对象)。它仅限制使用超类类型的变量调用类Horse中存在的附加方法。如果要调用类Horse的方法,则需要强制转换它。但要注意的是我们可以在底层蓝图类创建的对象中调用它们。这就是为什么如果你重写一个方法,那么如果你有一个超类型的变量,或者你将Horse的变量强制转换为Animal,或者只是使用类型为Horse的变量,那么无关紧要引用Horse的obkect,调用覆盖的方法将始终导致覆盖行为。

这些是我们作为程序员必须理解的东西,应该留给JVM实现。如何在内部工作可能会在不同的平台上发生变化,但合同和最终结果始终是相同的。

答案 2 :(得分:-1)

当你声明那样时,将为Horse类创建对象,它将在堆内存中创建。希望你找到足够的答案。 :)干杯!

答案 3 :(得分:-1)

这是java中的多态,明白吗?准确地说,这也称为动态绑定。我认为,作为一个新手,我们只是知道如何使用是好的,我是OS的新手,请模糊我的中文english = _ =