Java 中对象和非静态变量的内存分配
Memory Allocation of Objects and Non Static Variables in Java
在学校里,我的老师教我们关于对象和非静态变量(在Java中),她解释说如果我们声明一个非静态全局变量,在[=41中说int a
=] 并创建 class 的对象 obj
然后我们可以使用该对象访问非静态变量 a
通过使用点运算符 (obj.a
).
然后她说,如果我们创建另一个相同 class 的对象(例如,obj1
)并使用 obj1.a1
从中访问 a
,那么它将独立于 obj.a
因为 obj 和 obj1 是不同的对象,因此 obj.a
和 obj1.a
有不同的内存位置。
我的问题是,系统是否有对象的真实内存location/address?比如,内存分配是否类似于为对象分配地址,并且在它下面存储各种非静态变量(比如对象的内存位置被分区以容纳不同的非静态变量)?或者该对象只是一个假设元素,用于指向和访问各种非静态变量,这些变量实际上在存储中具有真实的内存位置?
Tl;dr: 存储是为对象分配内存位置,还是只对对象下的非静态变量这样做,以及该对象是一个假设元素,在存储中没有真正的内存位置?
如果回答此问题的人能对初学者友好一些,我将不胜感激,因为我现在才读 10 年级。
- 硬盘没有分配任何东西。 JVM 进行内存分配。
- 静态与内存分配无关。静态只是意味着该变量的值可用于 class 的所有实例,如果是私有的,或者任何 class 访问该变量,如果 public.
例如:
public class MyClass {
private static String value = "myStaticVariable";
}
MyClass 的所有实例都可以访问值并获得“myStaticVariable”。如果这些实例中的任何一个更改了该值,所有实例都会反映该更改。
至于如何执行内存分配,请将实例中的所有内容都视为指向内存位置的指针。如果它是原语,则会分配适当大小的内存,并且 class 实例指向该内存位置。 Java 对我们隐藏了这一点,因为我们真的不需要知道内部工作原理。如果变量指向另一个 class 那么它指向另一个实例,而这个实例又指向它自己的成员变量。如果稍后重新分配一个变量,那么原始内存分配将被标记为垃圾收集,以便在以后某个不可预见的时间处理。
一切都需要一个内存位置:每个对象,每个非静态变量和静态变量。
如果他们没有记忆位置,他们基本上就不存在。对象也需要一个内存位置,否则我们将不知道哪些非静态变量与哪些对象相关。
在学校里,我的老师教我们关于对象和非静态变量(在Java中),她解释说如果我们声明一个非静态全局变量,在[=41中说int a
=] 并创建 class 的对象 obj
然后我们可以使用该对象访问非静态变量 a
通过使用点运算符 (obj.a
).
然后她说,如果我们创建另一个相同 class 的对象(例如,obj1
)并使用 obj1.a1
从中访问 a
,那么它将独立于 obj.a
因为 obj 和 obj1 是不同的对象,因此 obj.a
和 obj1.a
有不同的内存位置。
我的问题是,系统是否有对象的真实内存location/address?比如,内存分配是否类似于为对象分配地址,并且在它下面存储各种非静态变量(比如对象的内存位置被分区以容纳不同的非静态变量)?或者该对象只是一个假设元素,用于指向和访问各种非静态变量,这些变量实际上在存储中具有真实的内存位置?
Tl;dr: 存储是为对象分配内存位置,还是只对对象下的非静态变量这样做,以及该对象是一个假设元素,在存储中没有真正的内存位置?
如果回答此问题的人能对初学者友好一些,我将不胜感激,因为我现在才读 10 年级。
- 硬盘没有分配任何东西。 JVM 进行内存分配。
- 静态与内存分配无关。静态只是意味着该变量的值可用于 class 的所有实例,如果是私有的,或者任何 class 访问该变量,如果 public.
例如:
public class MyClass {
private static String value = "myStaticVariable";
}
MyClass 的所有实例都可以访问值并获得“myStaticVariable”。如果这些实例中的任何一个更改了该值,所有实例都会反映该更改。
至于如何执行内存分配,请将实例中的所有内容都视为指向内存位置的指针。如果它是原语,则会分配适当大小的内存,并且 class 实例指向该内存位置。 Java 对我们隐藏了这一点,因为我们真的不需要知道内部工作原理。如果变量指向另一个 class 那么它指向另一个实例,而这个实例又指向它自己的成员变量。如果稍后重新分配一个变量,那么原始内存分配将被标记为垃圾收集,以便在以后某个不可预见的时间处理。
一切都需要一个内存位置:每个对象,每个非静态变量和静态变量。
如果他们没有记忆位置,他们基本上就不存在。对象也需要一个内存位置,否则我们将不知道哪些非静态变量与哪些对象相关。