【发布时间】:2020-02-19 00:20:55
【问题描述】:
对象是引用类型,这意味着对象的引用类型保存了实际数据存储在内存中的地址。
例如
Integer object = new Integer(3);
但如果我们谈论原始类型,比如int number = 3;,那么number 指向哪里?
它自己在内存中吗?它有什么?
【问题讨论】:
标签: java primitive primitive-types
对象是引用类型,这意味着对象的引用类型保存了实际数据存储在内存中的地址。
例如
Integer object = new Integer(3);
但如果我们谈论原始类型,比如int number = 3;,那么number 指向哪里?
它自己在内存中吗?它有什么?
【问题讨论】:
标签: java primitive primitive-types
原始类型可以存储在堆栈和堆中,具体取决于其范围。
在上面给出的示例中,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。
【讨论】:
原始数据类型存储在堆栈中,而引用数据类型存储在堆中。
所以当你说int number=3; 时,堆栈上的一块 32 位长(默认)的内存块被放在一边。这个块的值是 3,可以通过变量名 number 来识别。
但是当您说Integer object = new Integer(3); 时,内存是从堆中分配的,并且为该内存块创建了一个引用。此内存用于Integer 类的object 实例,因此它比int number 获得更多内存。这是因为 Integer 类封装在其中,不仅是 primitive int,还包括其他一些可以在其实例上使用的方法。
您还应该了解,当您将原始数据类型传递给赋值语句或函数时,它是通过副本传递,因此更改不会反映在原始变量上。但是如果你传递 Integer 对象,它会通过引用传递,即指向堆上那一大块内存的指针,因此更改在实际对象上是可见的。
【讨论】:
在 java 中,我们有一个叫做堆栈内存的东西,所有的原语都存储在其中。
有一个类似的讨论,你可以通过这个链接访问
【讨论】: