对象是引用类型,这意味着对象的引用类型将地址保存在存储实际数据的内存中。
例如
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;
指向哪里?
它本身是否在内存中?它拥有什么?
答案 0 :(得分:2)
答案 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。