【问题标题】:memory allocation for upcasting in javajava中向上转换的内存分配
【发布时间】:2014-01-27 06:54:54
【问题描述】:

考虑这些类:

public class Animal{

}

public class Dog extends Animal{

}

public AnimalTest(){
    public static void main(String[] args){
       Dog d = new Dog();
       Animal a = d;
   }
}

我的问题是,因为我对 Animal a = d; 执行了向上转换,它是消耗机器上的新内存分配还是使用分配给 Dog d = new Dog(); 的内存

【问题讨论】:

  • Animal a = d; 只是一个参考,没有内存分配。

标签: java memory-management upcasting


【解决方案1】:

Actual 对象或其内存占用不受影响。只是创建了对该对象的新引用。唯一的区别是引用 a 只能调用超类 Animal 中可用的方法或访问属性。

【讨论】:

  • 但是堆内存中发生了什么? Dog d =new Dog() 在堆中创建一个新的 Dog 对象,在堆栈​​中创建一个变量 d。变量 d 引用堆中的对象。但是变量 a 是向下转换的。这是否仍然意味着它将引用堆中的同一个对象 Dog 对象。如果是这样,编译器将如何知道它的向下转换。
【解决方案2】:

动物 a = d;

a 只是一个引用,引用的内存分配在方法堆栈(或 jvm 堆栈,而不是堆)中。

也就是当调用main方法时,JVM会分配一个包含引用空间的栈。

【讨论】:

  • 谢谢您的回复,我还想问一下,既然 Animal a 是一个引用,它是分配在 Dog d 分配的堆栈上的吗?在堆上?
  • @anathema 是的,new Dog() 分配在 JVM 堆上。
【解决方案3】:

当我们有父类的多个子类时,隐式向上转换确实有助于运行时多态性/方法覆盖。在这里,我们可以有一个父类类型的引用变量,而不是创建每个子类的引用变量来引用子类对象,以便将每个引用变量的额外内存分配保存在堆栈内存中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2019-03-08
    • 2011-12-02
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多