Java中的内存分配-声明与定义

Java中的内存分配-声明与定义,java,c,Java,C,在C语言中,当我们声明一些东西时,我们会告诉编译器变量包含什么类型的东西。只有在定义期间,我们才为它分配内存空间。然而,在Java中,当我们声明一个变量时,内存空间是被分配的 int x; // allocates space for an int 我的前提正确吗?这是否意味着我们应该尽可能地使用十分位进行稀疏处理?在为对象实例分配内存时,将为原语分配内存空间。对于静态原语,它将在加载类时分配 不,你不应该尝试微优化这些东西。这不是C,而是Java。当为对象实例分配内存时,将为原语分配内存空间

在C语言中,当我们声明一些东西时,我们会告诉编译器变量包含什么类型的东西。只有在定义期间,我们才为它分配内存空间。然而,在Java中,当我们声明一个变量时,内存空间是被分配的

int x; // allocates space for an int

我的前提正确吗?这是否意味着我们应该尽可能地使用十分位进行稀疏处理?

在为对象实例分配内存时,将为原语分配内存空间。对于静态原语,它将在加载类时分配


不,你不应该尝试微优化这些东西。这不是C,而是Java。

当为对象实例分配内存时,将为原语分配内存空间。对于静态原语,它将在加载类时分配


不,你不应该尝试微优化这些东西。这不是C,而是Java。

当谈到Java中的变量时,声明和定义之间没有分离。不过,这并不影响内存分配过程

Java中内存分配的情况与C中从动态区域(即“堆”)分配内存的情况相近。在这里,定义指针类型的变量为变量本身分配空间,但它不会为指针指向的对象分配内存。以下是C语言中简单字符串操作的示例:

// Allocate memory for the pointer
char *str;
// Allocate memory for the string itself
str = malloc(16);
// Copy the data into the string
strcpy(str, "Hello, world!");
在Java中处理对象时也会发生类似的情况。定义变量会为对象引用分配空间,但不会为对象分配空间。您需要调用
new
,以便将该引用“附加”到新对象:

// Allocate memory for the reference
String str;
// Allocate memory for the string, and sets data
str = new String("Hello, world!");

请注意,这仅适用于对象。原语类型的处理方式不同,与C中处理原语的方式非常相似。

在Java中,对于变量,声明和定义之间没有分离。不过,这并不影响内存分配过程

Java中内存分配的情况与C中从动态区域(即“堆”)分配内存的情况相近。在这里,定义指针类型的变量为变量本身分配空间,但它不会为指针指向的对象分配内存。以下是C语言中简单字符串操作的示例:

// Allocate memory for the pointer
char *str;
// Allocate memory for the string itself
str = malloc(16);
// Copy the data into the string
strcpy(str, "Hello, world!");
在Java中处理对象时也会发生类似的情况。定义变量会为对象引用分配空间,但不会为对象分配空间。您需要调用
new
,以便将该引用“附加”到新对象:

// Allocate memory for the reference
String str;
// Allocate memory for the string, and sets data
str = new String("Hello, world!");

请注意,这仅适用于对象。原语类型的处理方式不同,与C中处理原语的方式更为相似。

(1)不要担心,如果这样做,您将编写可怕的代码。(2) 你说的是原语还是原语和对象。(3) 唯一有意义的是巨大的数组,它们是对象。我对这两个都很好奇。但我说的内存是在Java中的声明过程中分配的,而不是在C中的定义过程中分配的,对吗?定义和声明是什么意思?虽然从技术上讲,C声明不分配任何东西是正确的,但任何(有用的)声明仍然需要在某个地方定义,并且您的示例代码不是C中的声明(Java称之为“声明”,实际上它在道德上等同于C定义;Java只是没有这种区别)(谁在乎,我也不确定)。唯一会成为问题的是大型数组和对象;它们都有分配给
new
的内存。毕竟int[][]可以有介于0(技术上不完全是0)和无穷大(1)之间的任意大小。别担心,如果这样做,你会写出可怕的代码。(2)你说的是原语还是原语和对象唯一重要的是大型数组,它们是对象。我对两者都很好奇。但我说的内存是在Java中的声明期间分配的,而不是在C中的定义期间分配的,这是正确的吗?定义和声明是什么意思?虽然从技术上讲,C声明不分配任何东西,但任何(有用的)都是正确的声明在某些地方仍然需要一个定义,而您的示例代码不是C中的声明(虽然Java称之为“声明”,但实际上它在道德上等同于C定义;Java只是没有这种区别)。唯一会成为问题的是大型数组和对象;它们都有分配给
new
的内存。毕竟int[][]可以有介于0(技术上不完全是0)和无穷大之间的任何大小