【问题标题】:Difference between reference value and primitive value参考值与原始值的区别
【发布时间】:2020-02-19 00:20:55
【问题描述】:

对象是引用类型,这意味着对象的引用类型保存了实际数据存储在内存中的地址。

例如

Integer object = new Integer(3);

但如果我们谈论原始类型,比如int number = 3;,那么number 指向哪里?

它自己在内存中吗?它有什么?

【问题讨论】:

    标签: java primitive primitive-types


    【解决方案1】:

    原始类型可以存储在堆栈和堆中,具体取决于其范围。

    在上面给出的示例中,number 只是一块内存,保存数字 3 的二进制值表示,取决于它是局部变量还是实例变量,它可以存储在堆栈或堆中。

    查看帖子Do Java primitives go on the Stack or the Heap?Stack Memory and Heap Space in Java

    class Person {
        int pid;
        String name;
    
        // constructor, setters/getters
    }
    
    public class Driver {
        public static void main(String[] args) {
            int id = 23;
            String pName = "Jon";
            Person p = null;
            p = new Person(id, pName); // primitive in heap
        }
    }
    
    

    堆中的原始类型示例:当pPerson构造函数赋值时,在堆内存中创建了一个Person类的新实例,它的内存块保存值为23。

    【讨论】:

      【解决方案2】:

      原始数据类型存储在堆栈中,而引用数据类型存储在中。

      所以当你说int number=3; 时,堆栈上的一块 32 位长(默认)的内存块被放在一边。这个块的值是 3,可以通过变量名 number 来识别。

      但是当您说Integer object = new Integer(3); 时,内存是从堆中分配的,并且为该内存块创建了一个引用。此内存用于Integer 类的object 实例,因此它比int number 获得更多内存。这是因为 Integer 类封装在其中,不仅是 primitive int,还包括其他一些可以在其实例上使用的方法。

      您还应该了解,当您将原始数据类型传递给赋值语句或函数时,它是通过副本传递,因此更改不会反映在原始变量上。但是如果你传递 Integer 对象,它会通过引用传递,即指向堆上那一大块内存的指针,因此更改在实际对象上是可见的。

      【讨论】:

      • “但是如果你传递Integer对象,它是通过引用传递的……” ...更准确地说,引用本身是通过值传递给方法的。因此,在方法中为参数变量重新分配一个新的对象引用不会对调用代码中的引用变量产生影响。
      【解决方案3】:

      在 java 中,我们有一个叫做堆栈内存的东西,所有的原语都存储在其中。

      有一个类似的讨论,你可以通过这个链接访问

      Where does the JVM store primitive variables?

      【讨论】:

        猜你喜欢
        • 2012-10-27
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        • 2021-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多