Для чего предназначены цепочки конструкторов

Обновлено: 02.05.2024

Зачем нужны конструкторы? Объясните подробно

Предположим, у нас есть класс с именем Student . И у нас есть имя переменной экземпляра и roll_number . Теперь, если мы создадим 1000 объектов, то JVM инициализирует эти значения своим типом по умолчанию Name = null и rollNo = 0 . Идентификация этих отдельных объектов невозможна, а присвоение значений каждому из объектов увеличит объем кода, что считается плохой практикой в программировании. Поэтому, чтобы этого избежать, используются конструкторы. То есть, цель конструктора в Java состоит в том, чтобы инициализировать значение переменных экземпляра класса.

Какие типы конструкторов существуют в Java?

  • Default Constructor (Конструктор по умолчанию)
  • No-Argument Constructor (Конструктор без аргументов)
  • Parameterized Constructor (Параметризованный конструктор)

Что такое Default Constructor в Java?

Конструктор по умолчанию (Default Constructor) — это конструктор, созданный JVM во время выполнения, если конструктор не определен в классе. Основная задача конструктора по умолчанию — инициализировать значения экземпляров в соответствии с их типом по умолчанию. Пример конструктора по умолчанию в Java: Теперь для этого класса, если мы создадим объект, то внутри JVM появится конструктор по умолчанию, которому присвоено значение по умолчанию. Теперь, если мы напечатаем значение, то получим:

Что такое No-Argument Constructor (Конструктор без аргументов)?

Конструктор без аргументов — это конструктор, который можно явно определить для инициализации значения экземпляров. Например:

Что такое Parameterized Constructor (Параметризованный конструктор)?

Параметризованный конструктор — это конструктор, который принимает параметр для инициализации экземпляров. Например:

Каковы правила определения конструктора?

Имя конструктора должно совпадать с именем класса.

В Java не должно быть возвращаемого типа конструктора.

Единственно применяемые модификаторы для конструкторов:

  • public
  • default
  • protected
  • private

Конструкторы могут принимать любое количество параметров.

Модификаторы final, synchronized, static и abstract в конструкторе недопустимы.

Конструктор не поддерживает оператор return внутри своего тела.

В конструкторе могут быть исключения с оператором throw .

Допустимо использовать throws clause с конструктором.

Конструктор не должен формировать рекурсию.

Когда мы можем использовать private (частный) конструктор?

Если мы не хотим создавать объекты определенного класса извне, мы можем использовать закрытые или частные (private) конструкторы. Объявив конструкторы закрытыми, мы можем создавать объекты только внутри класса. Классы Singleton — хороший пример использования частных конструкторов.

Каким будет модификатор доступа конструктора по умолчанию, если мы не определим его явно?

Модификатор доступа конструктора по умолчанию всегда будет таким же, как модификатор класса. Если класс публичный, то конструктор тоже будет публичным. Если класс частный, то конструктор тоже будет частным. Аналогично будет и с другими модификаторами доступа.

Напишите вывод по приведенному ниже фрагменту кода и поясните

Мы получим такой вывод, потому что если мы не укажем в конструкторе ключевое слово super() или this() в первой строке, то JVM сама автоматически поместит его во время выполнения. JVM делает это, потому что он наследуется от другого класса, и его функциональность также будет реализована в производном классе. Таким образом, присваивая экземплярам базового класса значения по умолчанию, JVM по умолчанию добавляет ключевое слово super() .

Рассмотрите код и укажите, является ли он действительным (valid) или недействительным (invalid). Поясните причину

Приведенный выше код недействителен, потому что он является одним и тем же конструктором внутри конструктора Scaler Academy . Это создает рекурсию в конструкторе, что недопустимо. Соответственно, мы получим ошибку времени компиляции, связанную с вызовом рекурсивного конструктора.

Можем ли мы использовать два конструктора в одном классе в Java?

  • Параметры конструкторов должны быть разными.
  • В конструкторе не должно быть рекурсии.

Можем ли мы переопределить (override) конструктор в Java?

Может ли конструктор быть окончательным (final) в Java?

Никакой конструктор не может быть окончательным (final). Это связано с тем, что ключевые слова final используются для остановки переопределения метода в производном классе. Но в конструкторе концепция переопределения неприменима, поэтому нет необходимости писать ключевое слово final . Если же мы напишем ключевое слово final в конструкторе, то получим ошибку времени компиляции под названием required return type (требуется возвращаемый тип), потому что компилятор рассматривает это как метод.

Может ли конструктор быть статическим (static) в Java?

Нет, конструктор Java не может быть статическим. Это связано с тем, что ключевые слова static используются, когда мы хотим, чтобы член принадлежал классу, а не объекту. Но конструкторы предназначены для инициализации объектов, поэтому компилятор будет рассматривать его как метод. Мы получим ошибку required return type.

Опишите разницу между super(), super и this(), this

Что такое деструкторы? Существует ли деструктор в Java?

Destructors (Деструкторы) используются для освобождения памяти, полученной программой. Например, если память необходима программе во время ее выполнения, то деструктор освобождает эту память, чтобы ее могли использовать другие программы. В Java нет понятия деструктора, поскольку работа по освобождению памяти в Java обрабатывается сборщиком мусора.

Что такое цепь конструкторов (constructor chaining) в Java?

Обязательное условие — Конструкторы в Java
Цепочка конструктора — это процесс вызова одного конструктора из другого конструктора относительно текущего объекта.
Цепочка конструктора может быть выполнена двумя способами:

  • Внутри того же класса : это можно сделать с помощью ключевого слова this () для конструкторов в одном классе
  • Из базового класса: с помощью ключевого слова super () для вызова конструктора из базового класса.

Цепочка конструктора происходит через наследование . Задача конструктора подкласса — сначала вызвать конструктор суперкласса. Это гарантирует, что создание объекта подкласса начинается с инициализации членов данных суперкласса. В цепочке наследования может быть любое количество классов. Каждый конструктор вызывает цепочку, пока не будет достигнут класс наверху.

Зачем нам цепочка конструкторов?
Этот процесс используется, когда мы хотим выполнить несколько задач в одном конструкторе, вместо того, чтобы создавать код для каждой задачи в одном конструкторе, мы создаем отдельный конструктор для каждой задачи и делаем их цепочку, которая делает программу более читабельной.

Цепочка конструктора в том же классе, используя ключевое слово this ():

// Java-программа для иллюстрации цепочки конструктора
// внутри того же класса, используя ключевое слово this ()

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

// конструктор по умолчанию вызовет другой конструктор

// используя это ключевое слово из того же класса

// вызывает конструктор 2

System.out.println( "The Default constructor" );

// параметризованный конструктор 2

// вызывает конструктор 3

// параметризованный конструктор 3

Temp( int x, int y)

public static void main(String args[])

// сначала вызывает конструктор по умолчанию

Правила построения конструктора:

  1. Выражение this () всегда должно быть первой строкой конструктора.
  2. Должен быть хотя бы один конструктор без ключевого слова this () (конструктор 3 в примере выше).
  3. Цепочка конструктора может быть достигнута в любом порядке.

Что произойдет, если мы изменим порядок конструкторов?

Ничего, конструктор цепочки может быть достигнут в любом порядке

// Java-программа для иллюстрации цепочки конструктора
// внутри того же класса, используя ключевое слово this ()
// и меняем порядок конструкторов

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

// параметризованный конструктор 2

// вызывает конструктор по умолчанию

// параметризованный конструктор 3

Temp( int x, int y)

// вызывает параметризованный конструктор 2

public static void main(String args[])

// вызывает параметризованный конструктор 3

ПРИМЕЧАНИЕ. В примере 1 конструктор по умолчанию вызывается в конце, но в примере 2 конструктор по умолчанию вызывается сначала. Следовательно, порядок в цепочке конструктора не важен.

Конструктор Цепочка с другим классом с помощью ключевого слова super ():

// Java-программа для иллюстрации цепочки конструктора
// другой класс, использующий ключевое слово super ()

System.out.println( "No-argument constructor of" +

this .name = name;

System.out.println( "Calling parameterized constructor"

class Derived extends Base

System.out.println( "No-argument constructor " +

// параметризованный конструктор 4

// вызывает конструктор базового класса 2

System.out.println( "Calling parameterized " +

"constructor of derived" );

public static void main(String args[])

// вызывает параметризованный конструктор 4

Derived obj = new Derived( "test" );

// Вызывает конструктор без аргументов

// Derived obj = new Derived ();

Примечание: Подобно цепочке конструктора в том же классе, super () должна быть первой строкой конструктора, так как конструктор суперкласса вызывается перед конструктором подкласса.

Альтернативный метод: использование блока Init :
Когда мы хотим, чтобы определенные общие ресурсы выполнялись с каждым конструктором, мы можем поместить код в блок init . Блок Init всегда выполняется перед любым конструктором, всякий раз, когда конструктор используется для создания нового объекта.

// блок, который будет выполнен перед любым конструктором.

System.out.println( "init block" );

// конструктор без аргументов

// конструктор с одним аргументом.

public static void main(String[] args)

// Создание объекта путем вызова без аргумента

// Создание объекта путем вызова параметризованного

// конструктор с одним параметром.

ПРИМЕЧАНИЕ. Если имеется более одного блока, они выполняются в том порядке, в котором они определены в одном и том же классе. Смотрите экс.
Пример :

// блок, который будет выполнен первым

// блок, который будет выполнен после первого блока

// который был определен выше.

public static void main(String args[])

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Узнайте, как использовать ключевое слово this в Java для ссылки на текущий объект.

1. введение

В этом уроке мы рассмотрим ключевое слово this Java.

В Java это ключевое слово является ссылкой на текущий объект, метод которого вызывается .

Давайте рассмотрим, как и когда мы можем использовать это ключевое слово.

2. Устранение Неоднозначности Затенения Полей

Ключевое слово полезно для устранения неоднозначности переменных экземпляра из локальных параметров . Наиболее распространенная причина заключается в том, что у нас есть параметры конструктора с тем же именем, что и поля экземпляра:

Как мы видим здесь, мы используем this с полями name и age instance – чтобы отличить их от параметров.

Другое использование-использовать this с параметром скрытия или затенения в локальной области. Пример использования можно найти в статье Переменная и Метод скрытия .

3. Ссылки на конструкторы одного и того же класса

Из конструктора мы можем использовать this() для вызова другого конструктора того же класса . Здесь мы используем this() для цепочки конструкторов, чтобы уменьшить использование кода.

Наиболее распространенным вариантом использования является вызов конструктора по умолчанию из параметризованного конструктора:

Или мы можем вызвать параметризованный конструктор из конструктора без аргументов и передать некоторые аргументы:

Обратите внимание, что this() должен быть первым оператором в конструкторе, иначе произойдет ошибка компиляции.

4. Передача этого в качестве параметра

Здесь у нас есть print Instance() метод, в котором определено ключевое слово this |/аргумент:

Внутри конструктора мы вызываем метод print Instance () . С помощью this мы передаем ссылку на текущий экземпляр.

5. Возврат этого

Мы также можем использовать это ключевое слово для возврата текущего экземпляра класса из метода.

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

6. Ключевое слово this Во Внутреннем классе

Мы также используем this для доступа к экземпляру внешнего класса из внутреннего класса:

Здесь, внутри конструктора, мы можем получить ссылку на экземпляр Keyword Test с помощью Keyword Test.this call . Мы можем пойти еще глубже и получить доступ к переменным экземпляра, таким как Ключевое слово Test.this.name поле.

Конструктор в Java, конструктор классов java, конструктор по умолчанию java, перегрузка конструктора в java, цепочка конструкторов в java, частный конструктор в java, типы конструктора в java, параметризованный конструктор в java, конструктор копирования java, пример конструктора java, супер конструктор java.

Конструктор в java используется для создания экземпляра класса. Конструкторы почти похожи на методы, за исключением двух вещей – его имя совпадает с именем класса, и у него нет возвращаемого типа. Иногда конструкторы также называются специальными методами для инициализации объекта.

Конструктор на Java

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

Если мы добавим возвращаемый тип в конструктор, то он станет методом класса. Это способ, которым среда выполнения java различает обычный метод и конструктор. Давайте предположим, что у нас есть следующий код в Employee классе.

Здесь первым является конструктор, обратите внимание, что нет возвращаемого типа и инструкции return. Второй-это обычный метод, в котором мы снова вызываем первый конструктор, чтобы получить экземпляр сотрудника и вернуть его. Рекомендуется, чтобы имя метода не совпадало с именем класса, так как это создает путаницу.

Типы конструкторов в Java

В java существует три типа конструкторов.

  1. Конструктор по умолчанию
  2. Конструктор без аргументов
  3. Параметризованный конструктор

Давайте рассмотрим все эти типы конструкторов на примерах программ.

Конструктор по умолчанию в Java

Не обязательно всегда предоставлять реализацию конструктора в коде класса. Если мы не предоставляем конструктор, то java предоставляет нам реализацию конструктора по умолчанию для использования. Давайте рассмотрим простую программу, в которой используется конструктор по умолчанию, поскольку мы не будем явно определять конструктор.

  1. Роль конструктора по умолчанию заключается только в инициализации объекта и возврате его в вызывающий код.
  2. Конструктор по умолчанию всегда без аргумента и предоставляется компилятором java только в том случае, если не определен существующий конструктор.
  3. Большую часть времени нас устраивает сам конструктор по умолчанию, так как другие свойства могут быть доступны и инициализированы с помощью методов getter setter.

Конструктор без аргументов

Конструктор без каких-либо аргументов называется конструктором без аргументов. Это похоже на переопределение конструктора по умолчанию и используется для выполнения некоторых операций предварительной инициализации, таких как проверка ресурсов, сетевых подключений, ведение журнала и т. Д. Давайте быстро взглянем на конструктор без аргументов в java.

Теперь , когда мы вызовем новые данные () , будет вызван наш конструктор без аргументов. Приведенное ниже изображение иллюстрирует это поведение, проверьте вывод программы на консоль.

Параметризованный конструктор

Конструктор с аргументами называется параметризованным конструктором. Давайте рассмотрим пример параметризованного конструктора в java.

Перегрузка конструктора в Java

Когда у нас есть более одного конструктора, это перегрузка конструктора в java. Давайте рассмотрим пример перегрузки конструктора в java-программе.

Частный конструктор в Java

Обратите внимание , что мы не можем использовать абстрактные , окончательные, статические и синхронизированные ключевые слова с конструкторами. Однако мы можем использовать модификаторы доступа для управления созданием экземпляра объекта класса. Использование общедоступного и по умолчанию доступа по-прежнему нормально, но какой смысл делать конструктор закрытым? В этом случае любой другой класс не сможет создать экземпляр класса.

Ну, конструктор делается закрытым на случай, если мы захотим реализовать шаблон одноэлементного проектирования . Поскольку java автоматически предоставляет конструктор по умолчанию, мы должны явно создать конструктор и сохранить его в тайне. Клиентским классам предоставляется служебный статический метод для получения экземпляра класса. Ниже приведен пример частного конструктора для Данных класса.

Цепочка конструкторов в Java

Когда конструктор вызывает другой конструктор того же класса, это называется цепочкой конструкторов. Мы должны использовать это ключевое слово для вызова другого конструктора класса. Иногда он используется для установки некоторых значений переменных класса по умолчанию.

Обратите внимание, что другой вызов конструктора должен быть первым оператором в блоке кода. Кроме того, не должно быть рекурсивных вызовов, которые создадут бесконечный цикл. Давайте рассмотрим пример цепочки конструкторов в java-программе.

Обратите внимание, как один конструктор вызывается из другого конструктора, это называется процессом цепочки конструкторов.

Супер Конструктор Java

Иногда класс наследуется от суперкласса, в этом случае, если нам нужно вызвать конструктор суперкласса, мы можем сделать это с помощью ключевого слова super . Давайте рассмотрим пример использования конструктора суперкласса.

Обратите внимание, что вызов суперконструктора должен быть первым оператором в конструкторе дочернего класса. Также при создании экземпляра конструктора дочернего класса java сначала инициализирует суперкласс, а затем дочерний класс. Поэтому, если конструктор суперкласса явно не вызывается, то конструктор по умолчанию или без аргументов вызывается средой выполнения java. Давайте разберемся в этих концепциях на примере какой-нибудь программы.

Давайте предположим, что у нас есть два класса, как показано ниже.

Какова будет произведенная продукция? Вывод вышеприведенного кода будет:

Таким образом, вызов перешел к конструктору без аргументов класса Student, поскольку в первом операторе не было суперзвонка, вызывается конструктор без аргументов или конструктор по умолчанию класса Person. Отсюда и вывод. Что делать, если мы используем параметризованный конструктор класса Student как Студент-студент(34, "Pankaj"); , вывод будет:

Здесь вывод ясен, потому что мы явно вызываем конструктор суперкласса, поэтому Java не нужно выполнять какую-либо дополнительную работу с их стороны.

Конструктор копирования Java

Конструктор копирования Java принимает объект того же класса в качестве аргумента и создает его копию. Иногда нам нужна копия другого объекта, чтобы выполнить некоторую обработку. Мы можем сделать это следующими способами:

  1. реализовать клонирование
  2. предоставление служебного метода для глубокого копирования объекта.
  3. Наличие конструктора копирования

Теперь давайте посмотрим, как написать конструктор копирования. Предположим, у нас есть класс Фрукты , как показано ниже.

Обратите внимание, что Фрукты(Fruits fr) выполняет глубокое копирование, чтобы вернуть копию объекта. Давайте рассмотрим тестовую программу, чтобы понять, почему для копирования объекта лучше использовать конструктор копирования.

Результатом приведенной выше программы является:

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

Конструкторы классов. Java JDK 1.5 - 1

Конструктор имеется в любом классе. Даже если вы его не написали, компилятор Java сам создаст конструктор по умолчанию (default constructor). Этот конструктор пустой и не делает ничего, кроме вызова конструктора суперкласса. Т.е. если написать: то это эквивалентно написанию: В данном случае явно класса предка не указано, а по умолчанию все классы Java наследуют класс Object поэтому вызывается конструктор класса Object . Если в классе определен конструктор с параметрами, а перегруженного конструктора без параметров нет, то вызов конструктора без параметров является ошибкой. Тем не менее, в Java, начиная с версии 1.5, можно использовать конструкторы с аргументами переменной длины. И если есть конструктор, имеющий аргумент переменной длины, то вызов конструктора по умолчанию ошибкой не будет. Не будет потому, что аргумент переменной длины может быть пустым. Например, следующий пример не будет компилироваться, однако если раскомментарить конструктор с аргументом переменной длины, то компиляция и запуск пройдут успешно и в результате работы строки кода DefaultDemo dd = new DefaultDemo() ; вызовется конструктор DefaultDemo(int . v) . Естественно, что в данном случае необходимо пользоваться JSDK 1.5. Файл DefaultDemo.java Результат вывода программы при раскомментаренном конструкторе: Однако, в распространенном случае, когда в классе вообще не определено ни одного конструктора, вызов конструктора по умолчанию (без параметров) будет обязательным явлением, поскольку подстановка конструктора по умолчанию происходит автоматически.

Создание объекта и конструкторы

  • Ищется класс объекта среди уже используемых в программе классов. Если его нет, то он ищется во всех доступных программе каталогах и библиотеках. После обнаружения класса в каталоге или библиотеке выполняется создание, и инициализация статических полей класса. Т.е. для каждого класса статические поля инициализируются только один раз.
  • Выделяется память под объект.
  • Выполняется инициализация полей класса.
  • Отрабатывает конструктор класса.
  • Формируется ссылка на созданный и инициализированный объект. Эта ссылка и является значением выражения, создающего объект. Объект может быть создан и с помощью вызова метода newInstance() класса java.lang.Class . В этом случае используется конструктор без списка параметров.

Перегрузка конструкторов

Конструкторы одного класса могут иметь одинаковое имя и различную сигнатуру. Такое свойство называется совмещением или перегрузкой(overloading). Если класс имеет несколько конструкторов, то присутствует перегрузка конструкторов.

Параметризированные конструкторы

Сигнатура конструктора – это количество и типы параметров, а также последовательность их типов в списке параметров конструктора. Тип возвращаемого результата не учитывается. Конструктор не возвращает никаких параметров. Это положение объясняет в некотором смысле, как Java различает перегруженные конструкторы или методы. Java различает перегруженные методы не по возвращаемому типу, а по числу, типам и последовательности типов входных параметров. Конструктор не может возвращать даже тип void , иначе он превратится в обычный метод, даже не смотря на сходство с именем класса. Следующий пример демонстрирует это. Файл VoidDemo.java В результате программа выведет: Это лишний раз доказывает, что конструктором является метод без возвращаемых параметров. Тем не менее, для конструктора можно задать один из трех модификаторов public , private или protected . И пример теперь будет выглядеть следующим образом: Файл VoidDemo2.java В конструкторе разрешается записывать оператор return , но только пустой, без всякого возвращаемого значения. Файл ReturnDemo.java

Конструкторы, параметризированные аргументами переменной длины

В Java SDK 1.5 появился долгожданный инструмент – аргументы переменной длины для конструкторов и методов(variable-length arguments). До этого переменное количество документов обрабатывалось двумя неудобными способами. Первый из них был рассчитан на то, что максимальное число аргументов ограничено небольшим количеством и заранее известно. В таком случае можно было создавать перегружаемые версии метода, по одной на каждый вариант списка передаваемых в метод аргументов. Второй способ рассчитан на неизвестное заранее и большое количество аргументов. В этом случае аргументы помещались в массив, и этот массив передавался методу. Аргументы переменной длины чаще всего задействованы в последующих манипуляциях с инициализациями переменных. Отсутствие некоторых из ожидаемых аргументов конструктора или метода удобно заменять значениями по умолчанию. Аргумент переменной длины есть массив, и обрабатывается как массив. Например, конструктор для класса Checking с переменным числом аргументов будет выглядеть так: Символьная комбинация . сообщает компилятору о том, что будет использоваться переменное число аргументов, и что эти аргументы будут храниться в массиве, значение ссылки на который содержится в переменной n. Конструктор может вызываться с разным числом аргументов, включая их полное отсутствие. Аргументы автоматически помещаются в массив и передаются через n. В случае отсутствия аргументов длина массива равна 0. В список параметров наряду с аргументами переменной длины могут быть включены и обязательные параметры. В этом случае параметр, содержащий переменное число аргументов должен обязательно быть последним в списке параметров. Например: Вполне очевидное ограничение касается количества параметров с переменной длиной. В списке параметров должен быть только один параметр переменной длины. При наличии двух параметров переменной длины компилятору невозможно определить, где заканчивается один параметр и начинается другой. Например: Файл Checking.java Например, есть аппаратура, способная распознавать номера автомобилей и запоминать номера квадратов местности, где побывал каждый из автомобилей за день. Необходимо из общей массы зафиксированных автомобилей отобрать те, которые в течение дня побывали в двух заданных квадратах, скажем 22 и 15, согласно карте местности. Вполне естественно, что автомобиль может в течение дня побывать во многих квадратах, а может только в одном. Очевидно, что количество посещенных квадратов ограничено физической скоростью автомобиля. Составим небольшую программу, где конструктор класса будет принимать в качестве аргументов номер автомобиля как обязательный параметр и номера посещенных квадратов местности, число которых может быть переменным. Конструктор будет проверять, не появился ли автомобиль в двух квадратах, если появился, то вывести его номер на экран.

Передача параметров в конструктор

  • основные типы (примитивы);
  • ссылки на объекты.
  • конструктор не может менять значения входных параметров основных (примитивных) типов;
  • конструктор не может изменять ссылки входных параметров;
  • конструктор не может переназначать ссылки входных параметров на новые объекты.
  • изменять состояние объекта, передаваемого в качестве входного параметра.

Конструкторы и блоки инициализации, последовательность действий при вызове конструктора

  1. Все поля данных инициализируются своими значениями, предусмотренными по умолчанию (0, false или null).
  2. Инициализаторы всех полей и блоки инициализации выполняются в порядке их перечисления в объявлении класса.
  3. Если в первой строке конструктора вызывается другой конструктор, то выполняется вызванный конструктор.
  4. Выполняется тело конструктора.
  • присвоить значение в объявлении;
  • присвоить значения в блоке инициализации;
  • задать его значение в конструкторе.

Ключевое слово this в конструкторах

Конструкторы используют this чтобы сослаться на другой конструктор в этом же классе, но с другим списком параметров. Если конструктор использует ключевое слово this , то оно должно быть в первой строке, игнорирование этого правила приведет к ошибке компилятора. Например: Файл ThisDemo.java Результат вывода программы: В данном примере имеется два конструктора. Первый получает строку-аргумент. Второй не получает никаких аргументов, он просто вызывает первый конструктор используя имя "John" по-умолчанию. Таким образом, можно с помощью конструкторов инициализировать значения полей явно и по умолчанию, что часто необходимо в программах.

Ключевое слово super в конструкторах

Конструкторы используют super , чтобы вызвать конструктор суперкласса. Если конструктор использует super , то этот вызов должен быть в первой строке, иначе компилятор выдаст ошибку. Ниже приведен пример: Файл SuperClassDemo.java В этом простом примере конструктор Child() содержит вызов super() , который создает экземпляр класса SuperClassDemo , в дополнение к классу Child . Так как super должен быть первым оператором, выполняемым в конструкторе подкласса, этот порядок всегда одинаков и не зависит от того, используется ли super() . Если он не используется, то сначала будет выполнен конструктор по умолчанию (без параметров) каждого суперкласса, начиная с базового класса. Следующая программа демонстрирует, когда выполняются конструкторы. Файл Call.java Вывод этой программы: Конструкторы вызываются в порядке подчиненности классов. В этом есть определенный смысл. Поскольку суперкласс не имеет никакого знания о каком-либо подклассе, то любая инициализация, которую ему нужно выполнить, является отдельной. По возможности она должна предшествовать любой инициализации, выполняемой подклассом. Поэтому-то она и должна выполняться первой.

Настраиваемые конструкторы

Механизм идентификации типа во время выполнения является одним из мощных базовых принципов языка Java, который реализует полиморфизм. Однако такой механизм не страхует разработчика от несовместимого приведения типов в ряде случаев. Самый частый случай – манипулирование группой объектов, различные типы которых заранее неизвестны и определяются во время выполнения. Поскольку ошибки, связанные с несовместимостью типов могут проявиться только на этапе выполнения, то это затрудняет их поиск и ликвидацию. Введение настраиваемых типов в Java 2 5.0 частично отодвигает возникновение подобных ошибок с этапа выполнения на этап компиляции и обеспечивает недостающую типовую безопасность. Отпадает необходимость в явном приведении типов при переходе от типа Object к конкретному типу. Следует иметь ввиду, что средства настройки типов работают только с объектами и не распространяются на примитивные типы данных, которые лежат вне дерева наследования классов. Благодаря настраиваемым типам все приведения выполняются автоматически и скрыто. Это позволяет обезопасить от несоответствия типов и гораздо чаще повторно использовать код. Настраиваемые типы можно использовать в конструкторах. Конструкторы могут быть настраиваемыми, даже если их класс не является настраиваемым типом. Например: Поскольку конструктор GenConstructor задает параметр настраиваемого типа, который должен быть производным классом от класса Number , его можно вызвать с любы

Читайте также: