【问题标题】:Memory Allocation of Objects and Non Static Variables in JavaJava中对象和非静态变量的内存分配
【发布时间】:2021-12-02 03:17:18
【问题描述】:

在学校里,我的老师教我们对象和非静态变量(在 Java 中),她解释说,如果我们声明一个非静态全局变量,比如说在一个类中 int a 并创建一个类的对象 obj然后我们可以使用对象通过点运算符(obj.a)访问非静态变量a

然后她说如果我们创建同一个类的另一个对象(比如obj1)并使用obj1.a1从中访问a,那么它将独立于obj.a,因为obj和obj1是不同的对象,因此obj.aobj1.a 具有不同的内存位置。

我的问题是,系统是否有对象的真实内存位置/地址? 就像,内存分配类似于为对象分配地址并在其下存储各种非静态变量(就像对象的内存位置被分区以适应不同的非静态变量)?还是该对象只是一个假设元素,用于指向和访问各种非静态变量,这些变量实际上在存储中具有真实的内存位置?

Tl;dr: 存储是为 object 分配内存位置,还是只为对象下的非静态变量分配内存位置,并且该对象是一个假设元素,不是在存储中有一个真实的内存位置?

如果回答这个问题的人对初学者友好一点,我将非常感激,因为我现在才 10 年级。

【问题讨论】:

    标签: java object oop memory


    【解决方案1】:
    1. 硬盘没有分配任何东西。 JVM 进行内存分配。
    2. 静态与内存分配无关。静态只是意味着该变量的值可用于该类的所有实例(如果是私有的)或访问该变量的任何类(如果是公共的)。

    例如:

    public class MyClass {
        private static String value = "myStaticVariable";
    }
    

    MyClass 的所有实例都可以访问值并获得“myStaticVariable”。如果这些实例中的任何一个更改了该值,所有实例都会反映该更改。

    至于如何执行内存分配,请将实例中的所有内容都视为指向内存位置的指针。如果它是原语,则分配适当大小的内存,并且类实例指向该内存位置。 Java 对我们隐藏了这一点,因为我们真的不需要知道内部工作原理。如果变量指向另一个类,那么它指向另一个实例,而该实例又指向它自己的成员变量。如果稍后重新分配变量,则将原始内存分配标记为垃圾回收,以便在以后某个不可预见的时间处理。

    【讨论】:

    • 硬盘部分是我的一个粗心错误。但是您的其余答案并没有真正回答我的问题,对不起
    【解决方案2】:

    一切都需要一个内存位置:每个对象、每个非静态变量和静态变量。

    如果它们没有内存位置,它们基本上不存在。 Object 也需要一个内存位置,否则我们将不知道哪些非静态变量与哪些对象相关。

    【讨论】:

    • 补充一点,实际对象不在内存中的唯一情况是您没有实例化对象但声明它,例如。 Object o;Object o = new Object();。在后者中,对象已被创建并存储在内存位置中,在第一种情况下,只有一个引用。
    • 那么内存有两组,一组用于存储对象,一组用于存储变量?如果我听起来在这个话题上受过很差的教育,我很抱歉;我刚开始学习内存和存储在 Java 中的作用
    • @bruhmonent,java有两个存储位置:堆和栈。堆存储对象及其属性(意味着obj.a 的值将在此处),而堆栈存储局部变量(例如,在 main 中声明的 int)和对对象的引用(因此对 obj 的引用将在这里)。对象有自己的空间但必须在栈中有引用,任何自变量都直接入栈。
    • 堆和堆栈远远超出了要求,因此决定保持简单。
    • @bruhmoment 如果你刚开始说实话,我还不会太担心。有时它对性能很重要,但如果您熟悉语言和语法,则不是必须学习的。
    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多