Java вызов конструктора внутри конструктора

Вызов одного конструктора из другого

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

public Point(double x, double y)

this(0, 0); // вызов конструктора с двумя параметрами

В классе Point (точка) имеется два конструктора. Один, более общий, с двумя параметрами, предназначен для конструирования точки плоскости с заданными координатами. Другой, без параметров, строит точку с координатами (0, 0). В нем для экономии кода просто вызывается первый из конструкторов с параметрами (0, 0).

Есть одно ограничение на вызов одного конструктора из другого. Такой вызов должен быть первым оператором в вызывающем конструкторе.

Работа со строками (класс String)

Первый стандартный класс Java, который мы рассмотрим — это класс String. Этот класс определен в стандартной библиотеке Java. Он используется для работы со строками.

Откроем документацию по классу String. Во-первых, обратим внимание на конструкторы класса. В документации конструкторы класса описываются сразу после описания полей класса. Конструкторы класса String предоставляют широкие возможности конструирования строк.

public String() Создает пустую строку

public String(char[] value) Создает строку из массива символов.

public String(byte[] bytes) Создает строку из массива байт, преобразуя байты в символы в соответствии с кодировкой по умолчанию.

Есть и другие конструкторы класса String.

В силу важности строк в Java для класса String существуют расширенные возможности языка. По общим правилам создания объектов мы должны были бы при построении строки писать так

String str = new String(«какая-то строка»);

Такая запись допустима, но существует ее упрощенный вариант:

String str = «какая-то строка»;

Для строк определена операция сложения, которая означает конкатенацию (сцепление) строк. Определена операция сложения строки с числом. При этом сначала число преобразуется в строку, а потом выполняется конкатенация полученных строк.

Также определена операция сложения строки с любым объектом. Она выполняется так. Сначала для этого объекта вызывается метод toString(), потом выполняется конкатенация полученных строк. Метод toString() есть у всех объектов Java (рассмотрим подробнее при изучении наследования).

Примеры сложения строк с числами нам уже встречались — в операторах типа

System.out.println(«результат justify»> 6)

Модификаторы доступа уточняют модель объекта, контролируя, как именно его можно использовать. Проще говоря, модификаторы доступа определяют, что можно, а чего нельзя делать с объектом. Чтобы разобраться в этом, обратимся к примеру из процедурного программирования.

Назовем подпрограммой функцию, которая никогда не вызывается напрямую, а лишь из других функций. Предположим, что вы пишете библиотеку функций и подпрограмм, используемую несколькими другими программистами. В этом случае была бы полезна возможность помечать подпрограммы как вспомогательные функции, чтобы оградить пользователей от потенциально неправильного применения библиотеки, но добиться этого можно только путем документирования. В ООП же модификаторы доступа не просто обозначают степень важности функций, но и препятствуют их вызову из внешней программы. Тем самым реализуется языковое ограничение, запрещающее вызывать подпрограммы напрямую. Правильно спроектированные классы оказываются самодокументированными и самоконтролируемыми. Модификаторы доступа существуют по той же причине — чтобы облегчить повторное использование.

Пакет — это вместилище для некоторого набора классов и других пакетов. Пакет является самостоятельным пространством имен.

Отметим, что пакет физически содержит сущности, определенные в нем (говорят, что «сущности принадлежат пакету»). Это означает, что если будет уничтожен пакет, то будут уничтожено и все его содержимое.

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

Обычно физически библиотека — это jar-файл (rt.jar, например). Но свою личную библиотеку можно сделать и просто в каком-либо каталоге. Кроме того, библиотека может быть zip-файлом.

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

Пока познакомимся с использованием пакетов из стандартной библиотеки Java. Лучше всего обратиться к документации по API Java. Полный список пакетов стандартной библиотеки Java:

Источник

Как вызвать конструктор из конструктора java

Если в классе есть два конструктора, один из которых принимает параметры, а другой нет, то второй может вызвать первый с помощью ключевого слова this .

Кроме того из конструктора мы можем вызвать конструктор родительского класса с помощью ключевого слова super .

public class App  public static void main(String[] args)  class ClassX  int x; public ClassX()  // Конструктор без параметров this(0); // Вызов конструктора с параметрами > public ClassX(int xValue)  x = xValue; > > class ClassXY extends ClassX  int y; public ClassXY(int xValue, int yValue)  super(xValue); // вызов родительского конструктора y = yValue; > > ClassX classX = new ClassX(); System.out.println(classX.x); // => 0 ClassXY classXY = new ClassXY(1, 2); System.out.println(classXY.x + classXY.y); // => 3 > > 

Источник

Вызов одного конструктора из другого в Java

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

Рассмотрим простой пример. Представим, что есть класс Car , который имеет два конструктора. Один конструктор принимает два параметра – марку автомобиля и его цвет, а другой – только марку. В обоих случаях нам нужно инициализировать марку, но цвет нужно инициализировать только в первом случае.

public class Car < private String brand; private String color; public Car(String brand, String color) < this.brand = brand; this.color = color; >public Car(String brand) < this.brand = brand; this.color = "Black"; >>

В приведенном выше коде видно, что инициализация марки дублируется в обоих конструкторах. Чтобы избежать дублирования кода, можно вызвать один конструктор из другого с помощью ключевого слова this .

public class Car < private String brand; private String color; public Car(String brand, String color) < this.brand = brand; this.color = color; >public Car(String brand) < this(brand, "Black"); >>

В этом примере конструктор, который принимает только один аргумент, вызывает другой конструктор с помощью this(brand, «Black») . В результате, инициализация марки теперь выполняется только в одном месте.

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

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

Источник

Конструкторы. Конструкторы по умолчанию. Вызов конструкторов класса из других конструкторов

Конструктор по умолчанию (default constructor) – это конструктор, который не имеет параметров. Конструктор по умолчанию может объявляться в классе явным образом или генерироваться автоматически.

В наиболее общем случае, для класса ClassName , конструктор по умолчанию имеет следующий вид:

class ClassName < . // объявление конструктора ClassName() < // тело конструктора // . > . >
2. В каких случаях конструктор по умолчанию генерируется в классе автоматически а в каких нет? Пример

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

Например. В следующем объявлении класса конструктор по умолчанию генерируется автоматически

class CMyClass < int d; int GetD() < return d; > void SetD(int nd) < d = nd; > >

Вышеприведенный код означает, что можно объявлять объект класса с использованием конструктора по умолчанию:

// работает, так как в классе больше не реализовано ни одного конструктора CMyClass mc = new CMyClass();

Если в тело класса CMyClass добавить хотя бы один другой конструктор (например, конструктор с одним параметром), то конструктор по умолчанию автоматически генерироваться не будет

class CMyClass < int d; // объявление конструктора с 1 параметром, // конструктор по умолчанию уже не генерируется автоматически CMyClass(int nd) < d = nd; > int GetD() < return d; > void Set(int nd) < d = nd; > >

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

// ошибка компиляции, так как в классе уже объявлен другой конструктор // CMyClass mc = new CMyClass(); CMyClass mc2 = new CMyClass(7); // а этот код работает

В результате выполнения вышеприведенной строки будет выдана ошибка компиляции:

The constructor CMyClass() is undefined

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

class CMyClass < int d; // явное объявление конструктора по умолчанию CMyClass() < d = 0; > // объявление конструктора с 1 параметром, CMyClass(int nd) < d = nd; > int GetD() < return d; > void Set(int nd) < d = nd; > >

После такой реализации можно создавать экземпляр класса с использованием двух конструкторов, например

CMyClass mc = new CMyClass(); // вызывается конструктор по умолчанию mc.d = 25; CMyClass mc2 = new CMyClass(5); // вызывается конструктор с 1 параметром
3. Вызов конструкторов из других конструкторов. Пример

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

Пример. В примере демонстрируется использование класса CPixel , который реализует пиксел на экране монитора.

// Класс, который реализует пиксел на экране монитора public class CPixel < // внутренние переменные класса  private int x, y; // координаты пиксела  private int color; // цвет пиксела // конструктор без параметров (конструктор по умолчанию) CPixel() < x = y = color = 0; > // конструктор с 2 параметрами, которые инициализируют только координаты CPixel(int _x, int _y) < x = _x; y = _y; color = 0; > // конструктор с 1 параметром, который инициализирует только цвет CPixel(int _color) < color = _color; x = y = 0; > // конструктор с 3 параметрами, который вызывает конструктор с 2 параметрами CPixel (int _x, int _y, int _color) < // вызов конструктора с 2 параметрами: обязательно первая операция и только один раз  this(_x, _y); //this(_color); // повторный вызов конструктора запрещен  this.color = _color; // так можно > // методы доступа int GetX() < return x; >  int GetY() < return y; >  int GetColor() < return color; > >

Использование класса CPixel в другом программном коде (методе)

. CPixel cp1 = new CPixel(2,8); // вызов конструктора с 2 параметрами CPixel cp2 = new CPixel(3,5,8); // вызов конструктора, который вызовет другой конструктор int d; d = cp1.GetX(); // d = 2 d = cp2.GetColor(); // d = 8 d = cp2.GetY(); // d = 5 .
4. Какие ограничения (требования) накладываются на вызов других конструкторов из конструктора класса?

Чтобы корректно вызвать другие конструкторы из конструктора класса, нужно придерживаться следующих требований (ограничений):

  • вызвать можно только один другой конструктор класса. Вызвать два и больше других конструктора этого класса запрещено. Это вытекает из логики, что конструктор класса предназначен для создания объекта класса только один раз (а не два и больше раза);
  • вызов другого конструктора должен быть первой операцией в вызывающем конструкторе. Если в вызывающем конструкторе вызов другого конструктора реализовать второй (третьей и т.д.) операцией, то компилятор выдаст ошибку.
5. Можно ли вызвать конструктор из обычного метода класса?

Нет, нельзя. Конструктор класса может вызваться только из другого конструктора этого же класса. Главное назначение конструктора класса – создание экземпляров (объектов) класса. Этих привилегий лишены методы класса.

Связанные темы

Источник

Читайте также:  Php log error function
Оцените статью