如果类是预定义的,则实例变量作为对象

时间:2014-02-06 19:16:16

标签: java

可能是它的愚蠢问题!!

假设

 public class A{

            Long weight = 1200L;  
            Integer i = 10; 
            int z = 20;
            A a;  } 


   public class B extends A{

   public static void main(String[] args) { 

              B b = new B(); 
              B c = new B();
              B d = new B(); 
      }

   }

我想知道要创建多少个对象? 我所知道的,每个参考对应于b,c,d和Long,Integer,int的3个对象。此外,对应于b,c,d的每个对象具有实例变量" a"。

这是对的吗?如果是这样,这是否意味着如果我有一个包装类或任何预定义类的实例变量,我自己的对象wrt定义类(在我的整数和长整数)?

提前致谢

2 个答案:

答案 0 :(得分:4)

您对正在创建的B的计数是正确的。我认为问题的难点在于检查你是否理解

时会发生什么
  1. 定义了基本类型的字段(字段z
  2. 定义并初始化对象类型的字段(字段weighti
  3. 定义了对象类型的字段但未初始化(字段a
  4. 使用-128和+127
  5. 之间的包装基元对象初始化字段

    答案是仅在第二种情况下创建对象。原始类型的字段不是对象,未初始化的字段是null s。

    请注意,weighti是对象包装器中的基元。由于interning,-128和+127之间的数字是特殊的。

答案 1 :(得分:0)

Java维护256个Integer个对象的内部缓存,每个值从-128到127一个。当此范围内的int值被自动装箱时,来自此Integer个对象使用缓存 - 也就是说,不会创建新的Integer

因此,此代码分配给变量b.ic.id.i的值都是对内部缓存中对象的引用 - 新的Integer对象是根本不是由此代码创建的。

此代码运行时,会为变量Longb.weightc.weight创建三个d.weight个对象。为变量Bbc创建了三个d类对象。但是这段代码本身不会创建除这六个之外的对象。

这个问题的答案是六。