Конструкторы
Кроме обычных методов классы могут определять специальные методы, которые называются конструкторами. Конструкторы вызываются при создании нового объекта данного класса. Конструкторы выполняют инициализацию объекта.
Если в классе не определено ни одного конструктора, то для этого класса автоматически создается конструктор без параметров.
Выше определенный класс Person не имеет никаких конструкторов. Поэтому для него автоматически создается конструктор по умолчанию, который можно использовать для создания объекта Person. В частности, создадим один объект:
public class Program {
public static void main(String[] args) {
Person tom = new Person(); // создание объекта
tom.displayInfo();
// изменяем имя и возраст
tom.name = "Tom";
tom.age = 34;
tom.displayInfo();
}
}
class Person {
String name; // имя
int age; // возраст
void displayInfo() {
System.out.printf("Name: %s \tAge: %d\n", name, age);
}
}
Для создания объекта Person используется выражение new Person(). Оператор new выделяет память для объекта Person. И затем вызывается конструктор по умолчанию, который не принимает никаких параметров. В итоге после выполнения данного выражения в памяти будет выделен участок, где будут храниться все данные объекта Person. А переменная tom получит ссылку на созданный объект.
Если конструктор не инициализирует значения переменных объекта, то они получают значения по умолчанию. Для переменных числовых типов это число 0, а для типа String и классов - это значение null (то есть фактически отсутствие значения).
После создания объекта мы можем обратиться к переменным объекта Person через переменную tom и установить или получить их значения, например, tom.name = "Tom".
В итоге мы увидим в консоли:
Name: null Age: 0
Name: Tom Age: 34
Если необходимо, чтобы при создании объекта производилась какая-то логика, например, чтобы поля класса получали какие-то определенные значения, то можно определить в классе свои конструкторы. Например:
public class Program {
public static void main(String[] args) {
Person bob = new Person(); // вызов первого конструктора без параметров
bob.displayInfo();
Person tom = new Person("Tom"); // вызов второго конструктора с одним параметром
tom.displayInfo();
Person sam = new Person("Sam", 25); // вызов третьего конструктора с двумя параметрами
sam.displayInfo();
}
}
class Person{
String name; // имя
int age; // возраст
Person() {
name = "Undefined";
age = 18;
}
Person(String n) {
name = n;
age = 18;
}
Person(String n, int a) {
name = n;
age = a;
}
void displayInfo() {
System.out.printf("Name: %s \tAge: %d\n", name, age);
}
}
Теперь в классе определено три конструктора, каждый из которых принимает различное количество параметров и устанавливает значения полей класса.
Консольный вывод программы:
Name: Undefined Age: 18
Name: Tom Age: 18
Name: Sam Age: 25