2014-02-06 3 views
2

Может быть, это его глупый вопрос !!переменная экземпляра действует как объект, если класс предварительно определен

Пусть

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(); 
     } 

    } 

Я хочу знать, сколько объектов будут созданы? что я знаю, 3 объекта, соответствующие b, c, d и long, Integer, int для каждой ссылки. Более того, каждый объект, соответствующий b, c, d, имеет переменную экземпляра «a».

Это правильно? Если да, значит ли это, если у меня есть переменные экземпляра с классом-оболочкой или любым предопределенным классом, у меня есть собственный объект по определенному классу (в mycase Integer и Long)?

Заранее спасибо

+1

Кстати, переменная 'int' не ссылается на объект. –

+0

int как A ... нормальная переменная экземпляра – user2985842

+1

Я пропустил это главное создание экземпляров B. 9 объектов. –

ответ

4

Вы правильны о подсчете B s создается. Я думаю, что жесткая часть вопроса предназначена для проверки, если вы понимаете, что происходит, когда

  1. Поле примитивного типа определяется (поле z)
  2. Поле типа объекта определяется и инициализируется (поля weight и i)
  3. поля типа объекта определяются, но не инициализируются (поле a)
  4. поля инициализируются с объектом упакованных примитивным между -128 и +127

Ответ заключается в том, что объект создается только во втором случае. Поля примитивных типов не являются объектами, а неинициализированные поля - null.

Обратите внимание, что weight и i являются примитивами в обертках объектов. Номера от -128 до +127 являются особенными из-за interning.

+0

Как насчет трех экземпляров B? –

+0

@HotLicks Ой, я забыл написать об этом. Тем не менее, он понял это правильно. Благодаря! – dasblinkenlight

+0

Не могли бы вы объяснить больше Поле типа объекта определено, но не инициализировано (поле a) Поле инициализируется объектом обернутого примитива от -128 до +128 – user2985842

0

Java поддерживает внутренний кэш 256 Integer объектов, по одному для каждого значения от -128 до 127. Когда int значения в пределах этого диапазона autoboxed, Integer объекта из кэша используется - то есть, новый Integer является не создано.

Таким образом, значение, присвоенное переменный b.i, c.i и d.i этого код все ссылки на объекты во внутреннем кэше - новые Integer объектов не создается этим кодом вообще.

При выполнении этого кода, три Long объекты создаются, для переменных b.weight, c.weight и d.weight. Созданы три объекта класса B для переменных b, c и d. Но этот код сам не создает объекты, кроме этих шести.

Ответ на этот вопрос - шесть.

Смежные вопросы