对象的字段是否已分配?

问题描述 投票:0回答:2

我正在学习java语言,我有一个问题,在类中声明的变量例如int b=17作为属性;不在特定方法中,也不是静态的 无需调用 new 构造函数将其存储在堆中。默认情况下它在程序执行过程中存储在哪里?

java dynamic-memory-allocation
2个回答
3
投票

在 Java 中,当您将变量声明为类中的实例变量(也称为成员变量或属性)时,它与该类的每个实例相关联,而不是与该类的任何特定方法或实例相关联。

当从类创建对象时,这些变量存储在对象的内存空间中。让我们来详细分析一下:

  • 当你声明一个实例变量时,如 int b = 17;在课堂上,它 成为对象状态的一部分。
  • 每次使用 new 关键字创建对象时,都会生成一个单独的对象 创建实例变量的副本并与之关联 特定对象。
  • 这些实例变量的内存是在堆上分配的,并且 只要对象存在,它就存在。
public class MyClass {
    int b = 17; // This is an instance variable

    public static void main(String[] args) {
        MyClass obj1 = new MyClass();
        MyClass obj2 = new MyClass();

        // obj1 and obj2 have their own separate 'b' variables
        System.out.println(obj1.b); // prints 17
        System.out.println(obj2.b); // prints 17

        // You can modify the values independently
        obj1.b = 20;
        System.out.println(obj1.b); // prints 20
        System.out.println(obj2.b); // prints 17
    }
}

总而言之,类中声明的实例变量在创建对象时存储在堆内存中,并且每个对象都有自己的这些变量的副本。


0
投票

假设你有一个如下所示的类:

class Foo {
   int a;
   int b = 17;

   Foo() {
     this.a = 5;
   }
}

编译后会变成这样:

class Foo {
   int a;
   int b;

   Foo() {
     this.b = 17;
     this.a = 5;
   }
}

因此,正如您从这里看到的,在调用构造函数之前,不会发生初始化,即没有任何内容可存储。

现在,如果您的问题是构造函数如何知道它需要具体使用数字

5
17
,那么这些是编译后的类文件的一部分,随类一起加载。

© www.soinside.com 2019 - 2024. All rights reserved.