【问题标题】:Local Variables, Object references and it's memory allocation局部变量、对象引用及其内存分配
【发布时间】:2012-05-26 08:26:14
【问题描述】:

我有以下代码块:

class Student{

int age;               //instance variable
String name;     //instance variable

public Student()
 {
    this.age = 0;
    name = "Anonymous";
 }
public Student(int Age, String Name)
 {
    this. age = Age;
    setName(Name);
 }
public void setName(String Name)
 {
    this.name = Name;
 }
}

public class Main{
public static void main(String[] args) {
        Student s;                           //local variable
        s = new Student(23,"Jonh");
        int noStudents = 1;          //local variable
 }
}

我的问题与什么是局部变量、实例变量有关,以便知道它们在哪里分配,无论是在 HEAP 还是在 STACK 内存中。 在默认构造函数中,它似乎只存在一个局部变量,它是由 'this' 关键字创建的,但是如何' name = "Anonymous";'不认为是局部变量?它是对象类型,但那些也可以是本地变量,对吗? 顺便说一句,您能否举一个使用默认构造函数创建/实例化的对象的示例? 谢谢!

【问题讨论】:

标签: java memory-management scope variable-types


【解决方案1】:

简而言之,任何类型的名称都只存储引用,它们不直接存储对象。

完全受限于代码块的名称已在堆栈帧上为引用分配存储空间,该堆栈帧位于线程专用的堆栈上。

作为类成员的名称已为堆中的引用分配存储空间,位于表示该类实例的 Object 中。

作为类的静态成员的名称已为堆中的引用分配存储空间,在表示该类的类对象实例的对象内。

所有对象都存在于堆中;但是,对它们的引用可能存在于堆上的其他对象中,或者存在于堆栈上的引用占位符中。

所有原始数据类型都存储在应该存储引用的位置。

class Student {

  int age;         // value stored on heap within instance of Student
  String name;     // reference stored on heap within instance of Student

  public Student() {
    this.age = 0;
    name = "Anonymous";
  }

  public Student(int Age, String Name) {
    this.age = Age;
    setName(Name);
  }

  public void setName(String Name) {
    this.name = Name;
  }

}

public class Main {
  public static void main(String[] args) {
        Student s;                    // reference reserved on stack
        s = new Student(23, "John");  // reference stored on stack, object allocated on heap
        int noStudents = 1;           // value stored on stack
  }
}

【讨论】:

  • 我认为这可能是一个非常愚蠢的问题\怀疑,但是当您说“作为类成员的名称已为堆中的引用分配存储空间”时,这就是名称的 cas = "匿名"; ?以下是堆栈的引用占位符的情况吗? s = new Student(23, "John");
  • 不是一个愚蠢的问题。一个“匿名”类是一个类,所以它是在堆上分配的;但是,堆保存的信息不能与特定类型绑定,因为它是从抽象类型和代码中指定的,用于填充抽象部分。有时匿名类绑定了一个名称,有时该类只是直接使用而没有中间名称;但是,该类永远不会被赋予其自己唯一的基类型。
【解决方案2】:

所有原语 var (int, double, boolean) 都是在堆栈上创建的。 使用“new”分配的更复杂的对象位于堆中,您的变量只是对它的引用(指针)。

局部变量是存在于特定范围内的变量,例如“Student s”仅存在于 Main 方法中(它可以在堆栈中或堆中)

【讨论】:

  • 不,这并不完全正确。检查指向副本的链接。
猜你喜欢
  • 2012-08-12
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多