这是一个非常简单的问题,但无法在SO上找到准确的答案,任何人都能解释当我声明一个变量时内存中会发生什么:
Animal obj= new Horse();
如果你看到上面的声明类型(Animal)对象是不同的并且初始化(Horse)。场景背后会发生什么。
答案 0 :(得分:1)
动物obj =新马();
你正在构建一个可以完成马或动物工作的物体obj。 马是从动物遗传的。这样您就可以访问Animal的所有属性和方法。
在这里找到了 这是多态的基础:想象一下,你有几个继承自父类的子类。您希望通过父类中定义的接口/方法使用所有这些子类,而不必担心每个子类中的实现细节(每个子类可能做不同的事情,但具有相同的整体语义)。
这是可能的,因为子类与其父类具有IS-A关系,因为子类继承自父类。
我建议你学习继承&多态性:
答案 1 :(得分:1)
当您使用new
关键字时,您将创建一个对象。对象在堆中创建。 new Horse()
将在堆中创建Horse
的对象,并根据类Horse.java
进行初始化。
现在假设Horse
继承自Animal
而提交的案例。通过类型为Horse
(Animal
)的变量引用Animal a = new Horse()
的对象不会影响对象创建(即使您执行Horse h = new Horse()
也会创建相同的对象)。它仅限制使用超类类型的变量调用类Horse
中存在的附加方法。如果要调用类Horse
的方法,则需要强制转换它。但要注意的是我们可以在底层蓝图类创建的对象中调用它们。这就是为什么如果你重写一个方法,那么如果你有一个超类型的变量,或者你将Horse
的变量强制转换为Animal
,或者只是使用类型为Horse
的变量,那么无关紧要引用Horse
的obkect,调用覆盖的方法将始终导致覆盖行为。
这些是我们作为程序员必须理解的东西,应该留给JVM实现。如何在内部工作可能会在不同的平台上发生变化,但合同和最终结果始终是相同的。
答案 2 :(得分:-1)
当你声明那样时,将为Horse类创建对象,它将在堆内存中创建。希望你找到足够的答案。 :)干杯!
答案 3 :(得分:-1)
这是java中的多态,明白吗?准确地说,这也称为动态绑定。我认为,作为一个新手,我们只是知道如何使用是好的,我是OS的新手,请模糊我的中文english = _ =