- Конструктор Java: объектов, классов
- Объявление конструктора Java
- Перегрузка конструктора
- Конструктор по умолчанию, без аргументов
- Параметры
- Вызов
- Вызов конструктора из конструктора
- Вызов в суперклассах
- Модификаторы доступа
- Исключение
- Кофе-брейк #107. Метод Constructor в Java I Перегрузка Constructor. Абстрактные классы и интерфейсы Java
- Базовый Constructor
- Перегрузка Constructor
- Вызов другого Constructor
- Абстрактные классы и интерфейсы Java
Конструктор Java: объектов, классов
Java-конструктор – это специальный метод, который вызывается при создании экземпляра объекта. Другими словами, когда вы используете новое ключевое слово. Цель конструктора – инициализировать вновь созданный объект перед его использованием.
MyClass myClassObj = new MyClass();
Здесь создается новый объект MyClass и вызывается конструктор без аргументов MyClass.
Конструктор класса инициализирует экземпляры (объекты) этого класса. Обычно конструктор инициализирует поля объекта, которые необходимо инициализировать. Конструкторы также могут принимать параметры, поэтому поля могут быть инициализированы в объекте во время создания.
Объявление конструктора Java
Простой пример объявления конструктора:
- Первая часть объявления конструктора – это модификатор доступа. Он имеет те же значения, что и для методов и полей. Определяют, какие классы могут получить доступ (вызвать) конструктор.
- Вторая часть – это имя класса, к которому принадлежит конструктор. Использование сигнализирует компилятору, что это конструктор. Также обратите внимание, что конструктор не имеет возвращаемого типа, как другие методы Java.
- Третья часть – это список параметров, которые может принимать конструктор. Объявляются в круглых скобках () после части имени класса конструктора. В приведенном выше примере параметры не объявляются.
- Четвертая часть – это тело конструктора. Определяется внутри фигурных скобок <> после списка параметров. В приведенном выше примере нет операций внутри тела конструктора. Говорят, что это «пустой» конструктор.
Перегрузка конструктора
Класс может иметь несколько конструкторов, если их сигнатура (параметры, которые они принимают) не совпадают. Когда класс содержит несколько конструкторов, мы говорим, что конструктор перегружен (поставляется в нескольких версиях):
public class MyClass < private int number = 0; public MyClass() < >public MyClass(int theNumber) < this.number = theNumber; >>
Класс выше содержит два конструктора. Первый – без аргументов, то есть он не принимает параметров. Второй – принимает параметр int. Внутри тела значение параметра int присваивается полю, то есть значение параметра копируется в поле. Таким образом, поле инициализируется для данного значения параметра.
Ключевое слово this перед именем поля (this.number) необязательно. Оно просто сообщает компилятору, что это поле с именем number, на которое ссылаются.
Конструктор по умолчанию, без аргументов
Вам не нужно определять конструктор для класса, но если вы не этого не сделаете, компилятор вставит для вас конструктор по умолчанию без аргументов. Таким образом, когда класс скомпилирован, у него всегда будет конструктор без аргументов.
Если вы определите конструктор для своего класса, то компилятор не будет вставлять конструктор по умолчанию без аргументов в ваш класс.
Параметры
Конструктор может принимать параметры, которые потом используются для инициализации внутреннего состояния (полей) вновь созданного объекта:
В этом примере объявлены 3 параметра: первый, последний и год. Внутри тела значения этих трех параметров присваиваются полям объекта Employee.
Разрывы строки на Java после каждого параметра являются необязательными. Компилятор здесь игнорирует разрывы строк. Вы также можете написать объявление параметра в одну строку, если хотите, например:
public Employee(String first, String last, int year )
Чтобы вызвать этот конструктор, который принимает три параметра, вы должны создать экземпляр объекта Employee следующим образом:
Employee employee = new Employee("Jack", "Daniels", 2000);
Параметры передаются конструктору в скобках после имени класса справа от знака равенства. Затем объект создается, и конструктор выполняется. После выполнения описанного выше конструктора поля, инициализированные им, будут иметь значения параметров, передаваемых ему.
Параметр конструктора может иметь то же имя, что и поле. В этом случае у компилятора возникают проблемы, зная, на что вы ссылаетесь. По умолчанию, если параметр (или локальная переменная) имеет то же имя, что и поле в том же классе, параметр (или локальная переменная) «затеняет» поле. Посмотрите на этот пример:
Внутри конструктора класса Employee идентификаторы firstName, lastName и birthYear теперь ссылаются на параметры конструктора, а не на поля Employee с одинаковыми именами. Таким образом, конструктор теперь просто устанавливает параметры, равные им самим. Поля Сотрудника никогда не инициализируются.
Чтобы сообщить компилятору, что вы имеете в виду поля класса Employee, а не параметры, поместите ключевое слово this и точку перед именем поля:
Теперь поля Employee правильно инициализируются внутри конструктора.
Вызов
Вы вызываете конструктор, когда создаете новый экземпляр класса, содержащий его:
MyClass myClassVar = new MyClass();
Этот пример вызывает конструктор без аргументов для MyClass, как определено ранее в этом тексте.
Если вы хотите передать параметры конструктору, вы должны включить их в круглые скобки после имени класса:
MyClass myClassVar = new MyClass(1975);
Этот пример передает один параметр конструктору MyClass, который принимает int в качестве параметра.
Вызов конструктора из конструктора
В Java можно вызвать конструктор из другого конструктора. Для этого используется ключевое слово this:
public class Employee < private String firstName = null; private String lastName = null; private int birthYear = 0; public Employee(String first, String last, int year ) < firstName = first; lastName = last; birthYear = year; >public Employee(String first, String last) < this(first, last, -1); >>
Обратите внимание на второе определение конструктора. Внутри тела конструктора вы найдете этот оператор Java:
Ключевое слово this, за которым следуют скобки и параметры, означает, что вызывается другой конструктор в том же классе. Какой другой вызываемый конструктор зависит от того, какие параметры вы передаете в вызов конструктора (в скобках после ключевого слова this). В этом примере это первый конструктор в классе, который вызывается.
Вызов в суперклассах
В класс может расширять другой. В этом случае говорят, что он «наследует» от класса, который он расширяет. Расширяемый класс называется подклассом, а расширяемый – суперклассом.
Класс, который расширяет другой, не наследует его конструкторы. Однако подкласс должен вызывать конструктор в суперклассе внутри одного из конструкторов подкласса!
Класс Car расширяет (наследует) класс Vehicle:
public class Car extends Vehicle < private String brand = null; public Car(String br, String no) < super(no); this.brand = br; >>
Обратите внимание на конструктор в классе Car. Он вызывает конструктор в суперклассе, используя этот оператор:
Использование ключевого слова super относится к суперклассу класса. Когда за ключевым словом следуют круглые скобки, как здесь, это относится к конструктору в суперклассе. В этом случае это относится к конструктору в классе Vehicle. Поскольку Car расширяет Vehicle, все конструкторы Car должен вызывать конструктор в Vehicle.
Модификаторы доступа
Модификатор доступа конструктора определяет, какие классы в вашем приложении могут вызывать его. Например, если конструктор объявлен защищенным, то он может вызывать только классы в одном пакете или подклассы этого класса.
Класс может иметь несколько конструкторов, а каждый конструктор свой собственный модификатор доступа. Таким образом, некоторые конструкторы могут быть доступны для всех классов в вашем приложении, в то время как другие конструкторы доступны только для классов в том же пакете, подклассах или даже только для самого класса (частные конструкторы).
Исключение
Можно сгенерировать исключение из конструктора:
Обратите внимание на исключительную часть throws объявления конструктора. Она объявляет, что конструктор может выдать исключение. Если это произойдет, созданный экземпляр Car недействителен.
Вот пример вызова конструктора Car:
Car car = null; try < car = new Car(); //do something with car object >catch(Exception e) < // handle exception >
Если из конструктора Car выдается исключение, переменной car никогда не будет назначена ссылка на объект Car, который вы пытаетесь создать. Переменная car по-прежнему будет указывать на ноль.
Создание конструктора, создающего исключение, может быть хорошей идеей, если хотите предотвратить создание объекта данного класса в недопустимом состоянии. Обычно это входные параметры конструктора, которые могут привести к тому, что объект будет недействительным. Если конструктор обнаруживает неверный входной параметр, он вызывает исключение и предотвращает присвоение объекта какой-либо переменной.
Кофе-брейк #107. Метод Constructor в Java I Перегрузка Constructor. Абстрактные классы и интерфейсы Java
Источник: Objectorientedprogramming77 Что такое Constructor ? Это особый тип метода, имя которого совпадает с именем класса, который определяет, как объект инициализируется при его создании. Как и другие методы, мы также можем определить метод Constructor в нашей Java-программе, но, в отличие от других методов, мы не можем вызвать Constructor напрямую; Java вызывает конструктор автоматически при создании объекта. Когда мы используем ключевое слово new для создания объекта класса, Java делает три вещи:
- Выделяет память для объекта.
- Инициализируйте эту переменную экземпляра объекта с их начальным значением или значением по умолчанию.
- Вызывает конструктор Method класса.
Если в классе не определен какой-либо метод Constructor , мы все равно создадим объект этого класса, но мы должны установить переменную экземпляра или вызвать другие методы, которые впоследствии должны инициализировать объект этим объектом. Определяя метод Constructor в наших собственных классах, мы можем установить начальные значения переменной экземпляра, вызвать метод на основе этой переменной или вызвать методы для других объектов или вычислить начальные свойства нашего объекта. Мы также можем перегрузить Constructor , как и обычные методы, для создания объекта, который имеет определенные свойства на основе аргумента, который мы передаем для new .
Базовый Constructor
class Person < String name; int age; Person (String n, int a) < name = n; age = a; >void printPerson () < System.out.print("Hi, I am " +name); System.out.println(" I am "+ age + " years old."); >public static void main(String args[]) < Person p; p = new Person ("Ajab", 20); p.printPerson(); p = new Person ("Rizwan", 30); p.printPerson();
Перегрузка Constructor
Как и другие методы, Constructor также может принимать различное количество и типы параметров, что позволяет создавать объекты с заданными свойствами или чтобы Constructor мог вычислять свойства на основе различных типов ввода. Например, класс MyRectone в данной таблице создает конструктор MyRectone и передает другой параметр вместо создания разных методов для данных аргументов.
class MyRectone < int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 0; MyRectone ( int x1, int x2, int x2, int y2) < this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; >MyRectone (Point topLeft, Point bottomRight) < x1 = topLeft.x; y1 = topLeft.y; x2 = bottomRight.x; y2 = bottomRight.y; >MyRectone ( Point topLeft, int w, int h) < x1 = topLeft.x; y1 = top left.y; x2 = ( x1 + w); y2 = (y1 + h); >void printRect () < System.out.print ("MyRectone: "); > public static void main (String args [] ) < MyRectone rect; System.out.println ("Calling MyRectone with coordinates 35,35 70,70"); rect = new MyRectone (35,35,70,70); rect.printRect(); System.out.println ("Calling MyRectone with coordinates (15,15) (30,30)"); rect = new MyRectone (15,15,30,30); rect.printRect(); System.out.print (" Calling buildRect w/1 point (10,10),"); System.out.println ("width (50) and height (50)"); rect = new MyRectone ( new Point (10,10), 50, 50); rect.printRect();
Calling MyRectone with coordinates 35,35 70,70: MyRectone: Calling buildRect w/1 points (15,15), (30,30): MyRectone: Calling buildRect w/1 point (10,10), width (50) and height (50): MyRectone:
Вызов другого Constructor
Какой-либо конструктор может быть надмножеством другого конструктора, определенного в вашем классе; то есть, они могут вести себя так же плюс немного больше. Вместо того, чтобы дублировать идентичное поведение в нескольких методах конструктора в нашем классе, имеет смысл иметь возможность просто вызвать этот первый конструктор из тела второго конструктора. Java предоставляет для этого специальный синтаксис. Чтобы вызвать конструктор, определенный в текущем классе, используйте эту форму:
Абстрактные классы и интерфейсы Java
Источник: Dev.to Абстрактный класс — это класс, который имеет некоторые методы без полного определения и имеет модификатор abstract .
- Вы не можете создать объект с помощью конструктора абстрактного класса.
- Вы можете использовать абстрактный класс в качестве базового для определения производного класса.
- В абстрактном классе существует по крайней мере один абстрактный метод.
- Абстрактный метод : имеет заголовок, как и обычный метод, но без тела, и для него требуется модификатор abstract и точка с запятой.
- Абстрактный метод не может быть частным.
- Абстрактный класс может быть типом.
Пример:
public abstract class Example
- Интерфейс — это тип.
- Он содержит заголовки методов без определения и без переменных экземпляра:
public interface Interface1
- Включать implements InterfaceName .
- Класс должен реализовывать все заголовки методов, перечисленные в интерфейсе.
public class Implementer implements Interface1 < @Override public void method1() < //definition >@Override public int method2() < //definition >>
- Заголовки методов объявлены public .
- Абстрактный класс также может реализовывать интерфейс, этот класс дает определения для некоторых заголовков методов в интерфейсе.
- Интерфейсы Java также могут содержать constant , например:
public interface Constant
public class Constants implements Constant < public static void main(String[] args) < System.out.println(JANUARY); >>
- Вы можете смешивать использование интерфейсов, включая константы и заголовки методов в один интерфейс.
- В Java не поддерживается множественное наследование, поэтому класс может расширять только один базовый класс. Однако, используя интерфейсы, класс может реализовывать несколько интерфейсов:
public class Implementer implements Interface1, Interface2, .. InterfaceN
- Причина, по которой класс Java может расширять только один базовый класс, заключается в том, что если Java допускает два базовых класса, эти два класса могут иметь один и тот же заголовок метода с различным определением, что приведет к несогласованности.
- Два интерфейса могут быть несовместимыми, если определить две константы с одним и тем же именем и разными значениями:
public interface Interface1
public interface Interface1