2014-01-12 2 views
2

Я знаю, что при использовании:Вызов конструктора означает создание экземпляра?

A a = new A(); 

Он назначает место в куче, а затем вызывает конструктор, наконец возвращается ссылка. Но я смущен этим, если я вызываю конструктор в другом, или когда дочерний конструктор называет его родительским. Будет ли это два способа создать ряд экземпляров? Или один «новый» для «одного экземпляра»?

+2

это создаст экземпляр, если он выполняет 'new', а не в случае' это() 'или' супер() ' –

+0

прямо или косвенно вызова конструктора родителя всегда выполняется, чтобы убедиться, что ни один из выделенного пространства не содержат некоторое неопределенное значения. –

+0

ах ... понял, цель. – Telerik

ответ

3

Когда вы пишете this или super в первой строке конструктора, это вызывает другой конструктор для выполнения некоторых операций инициализации. Он НЕ создает отдельный экземпляр.

Таким образом, если класс A расширяет класс B и конструктор A вызовов super(), это означает, что пространство в памяти, которое было выделено для экземпляра B будет иметь дополнительную нагрузку инициализации сделано; но это делается в пространстве SAME, как и остальная часть конструктора для A. Так что, если вы пишете A myObject = new A();, шаги были бы -

  1. Присвоить пространство на куче
  2. Run конструктор для класса В (суперкласса)
  3. Запускаем REST конструктора для класса А
  4. Назначьте ссылку на созданное пространство на myObject.
+0

Благодарим вас за ответ, как вы сказали, кажется, что каждый раз, когда мы «новый экземпляр» для класса, который мы определяем, каждый экземпляр объекта был создан, правильно? – Telerik

+0

Если вы спрашиваете, существует ли индивидуальное соответствие между вызовом new и случаем создаваемого объекта, ответ да. (За исключением, конечно, строковых литералов, автобоксинга и различных трюков сериализации). –

+0

Автобоксирование не похоже на «новое» ключевое слово, не так ли? Вы имеете в виду, что «new String()» не вызывает конструктор объекта? – Telerik

0

Вообще говоря, существует четыре способа "инициализировать" класс:

  1. блок {} (редко используется)

  2. : Новичок инициализации поля private in i=0

  3. статический блок static {} (класс init)

  4. конструктор public MyClass(int i)

или 4,1 конструктор по умолчанию

(конструктор вызывается перед другими из них)

, но ни при каких обстоятельствах конструктор предполагает новый экземпляр. Новый экземпляр выполнен new Оператор. Когда вы вызываете конструктор из другого constrcutor (или называете конструктор суперкласса), вы просто «вызываете метод».

Примите мое отсутствие формализма, это лишь короткое неполное резюме.

+0

Откуда у вас возникла мысль, что 1. (называемый инициализатором _instance block_) никогда не используется? Кроме того, для инициализации класса используется только номер 3.; все остальные используются для инициализации экземпляров класса. Наконец, комментарий _ «конструктор вызывается перед другими» _ не имеет смысла; конечно статический блок выполняется перед любым конструктором или любым инициализатором экземпляра. Инициализаторы полей и блоки инициализатора экземпляра выполняются _ при выполнении конструктора. См. [JLS, §12.5] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5). –

+0

Тед, я не могу дать лекцию о конструкторах java, я изложил краткое изложение возможных инициализаций. Что касается «не смысла», см. Пункт 5 ссылки, которую вы мне прислали. Затем, после 12 лет java, вы первый парень, которого я знаю, который использует «блок инициализатора» ... это, конечно, не критика ... – venergiac

+0

Я использую блок инициализатора. Очень редко. Но я не могу сказать никогда. Я становлюсь вторым? –

1

Давайте следовать этому примеру из Java docs:

Point originOne = new Point(23, 94); 
Rectangle rectOne = new Rectangle(originOne, 100, 200); 
Rectangle rectTwo = new Rectangle(50, 100); 

Каждая из этих утверждений состоит из трех частей (подробно обсуждается ниже):

  • Декларация: Код выделены жирным шрифтом все переменной что связывает имя переменной с типом объекта.
  • Активация: новое ключевое слово - это оператор Java, который создает объект.
  • Инициализация: Новый оператор сопровождается вызовом конструктора, который инициализирует новый объект.

Поэтому new это ключевое слово, используемое для создания объекта и конструктор инициализирует новый объект.

+0

Мне нравится этот ответ ... – venergiac

+0

, но он не отвечает на вопрос. –

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