参考值和原始值之间的差异

时间:2019-10-22 19:40:13

标签: java primitive primitive-types

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

例如

con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filepath & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"

但是,如果我们谈论原始类型,例如Integer object = new Integer(3); ,那么int number = 3;指向哪里?

它本身是否在内存中?它拥有什么?

3 个答案:

答案 0 :(得分:2)

在Java中,我们有一个称为堆栈存储器的东西,用于存储所有原语。

您可以通过以下链接访问类似的讨论

Where does the JVM store primitive variables?

答案 1 :(得分:0)

原始数据类型存储在堆栈中,而参考数据类型存储在中。

因此,当您说int number=3;时,会在堆栈上放置32位长(默认情况下)的内存块。该块保留值3,并且可以通过变量名称​​ number 来标识。

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

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

答案 2 :(得分:0)

原始类型可以根据其范围存储在堆栈中。

在上面给出的示例中,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
    }
}

堆中原始类型的示例:当用p构造函数分配Person时,将在堆内存中创建Person类的新实例,该实例的内存块保持值为23。