我来自C / C ++背景,对java很新,我很难理解java中的变量声明和内存分配。
当我们写作时,
myclass myobject;
我们声明myobject是myclass类型的变量。我们没有为它分配内存。
int a;
它声明变量a并且还在堆栈中分配等于int大小的内存。
是这样的吗?编译器是为原始数据类型分配内存,而不是为非原始数据类型分配内存?
我提出了类似的疑问here。
答案 0 :(得分:11)
编译器不分配内存。它的JVM分配内存
对于原始数据类型,在声明这些变量时分配内存,并在该函数本地堆栈中获取内存。
int x;
以堆栈4字节分配的内存
当我们使用new运算符时,内存被分配给堆,这是类的数据成员的大小。
MyClass object;
这是引用变量也需要4字节的大小
object = new MyClass();
new运算符在堆中分配内存,大小是所有个体的总和 数据成员的那个类的大小。
答案 1 :(得分:0)
是这样的吗?编译器是为原始数据类型分配内存,而不是为非原始数据类型分配内存?
首先要注意的是Compiler不会分配任何内存。 JVM这样做。
来到实际问题,是的。对于原语天气你初始化它或者稍后,一旦你声明,内存分配。
这是基元的数据量
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
对于对象,在初始化时,内存分配。内存的大小实际上取决于Class数据。
答案 2 :(得分:0)
在java中,变量的声明并不意味着分配内存空间,但意味着此变量可以在以后保存具有相同类型的类(或子类)的对象的引用。
MyClass myObject;
// myObject具有空值(仅声明)
在您写下时分配内存空间:
MyClass myObject = new MyClass();
//当我们使用new运算符时(发生分配)
现在myObject有一个引用指向新MyClass()的结果对象,该对象的大小取决于其类声明中的数据字段。
<强>结论
声明
int a;
//分配固定大小,因为int size已知且无法更改
MyClass myObject;
//具有空值
myObject = new MyClass();
//现在有这个对象的引用
我希望这对你有帮助:)。
答案 3 :(得分:0)
在Java中, 当我们声明类类型的变量时,只会创建一个引用(未为该对象分配内存)。要为对象分配内存,我们必须使用new(),并且所有对象都在堆上动态分配。
在C ++中,可以在堆栈或堆上为对象分配内存。当我们使用new()分配对象时,该对象将在堆上分配。