Java引用变量计数



在这段代码中,有2个对象正在创建,但为什么只创建了4个引用变量?

class Customer {
public int custId;
public String custName;
}
public class Tester {
public static void main(String[] args){
Customer obj = new Customer();
Customer objOne = new Customer();
Customer objTwo;
Customer objThree = obj;
}
}

在Java中,有各种类型的变量,分为两大类:基元类型和引用类型。还有八种类型的变量(参见Java语言规范,§14.12.3(。规范中关于变量类型的相关部分有:

  1. 实例变量是在类声明中声明的字段,而不使用关键字static(§8.3.1.1(。

    如果类T有一个作为实例变量的字段a,则创建一个新的实例变量CCD_ 3,并将其初始化为默认值(§4.12.5(,作为类T或作为T子类的任何类的每个新创建对象的一部分(§8.1.4(
  • 局部变量由局部变量声明语句(§14.4(声明。

    每当控制流进入块(§14.2(或for语句(§14.14(时,都会为立即包含在该块或for语句中的局部变量声明声明语句中声明的每个局部变量创建一个新变量
  • 在您的代码中,我计算以下引用变量:

    方法main()中的四个局部变量:objobjOneobjTwoobjThree
  • main()中,创建了Customer的两个实例。每个实例创建为Customer字段custName带来一个引用类型的附加实例变量。(对于字段custId,每个新实例还产生一个基元类型的实例变量。(
  • 总共有六个参考变量。为什么你认为只创造了4个?

    如果您通过检查生成的字节码得出这个结论,那么main()中的一些局部变量可能被编译器优化掉了,因为(至少(其中两个变量在创建后立即超出范围(其中一个甚至没有赋值(。

    最新更新