English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве вы узнаете о конструкторах Java с помощью примеров, как создавать и использовать их, а также о различных типах конструкторов.
В Java каждый класс имеет свой конструктор, который автоматически вызывается при создании объекта класса. Конструкторы похожи на методы, но на самом деле они не являются методами.
одинJava методыКонструкторы Java различаются по имени и типу возвращаемого значения. Конструкторы имеют имя, которое совпадает с именем класса, и не возвращают никакого значения. Например,
class Test { Test() {}} // Тело constructor } }
Здесь Test() является constructor. У него есть имя, такое же как и у класса, и у него нет типа возвращения.
class Test { void Test() { // Тело метода } }
Здесь Test() имеет имя, такое же как и у класса, но у него есть тип возвращения void. Поэтому, это метод, а не constructor.
class Main { private int x; //Тело конструктора private Main() { System.out.println("Конструктор вызывается"); x = 5; } public static void main(String[] args) { // Вызов constructor при создании объекта Main obj = new Main(); System.out.println("Значение x = " + obj.x); } }
вывод:
Конструктор вызывается Значение x = 5
В上面的 примере у нас есть частный constructor с именем Main(). В методе main мы создаем объект класса с именем obj.
Main obj = new Main();
В этом процессе вызывается constructor. Поэтому, выполняется команда print и инициализируется переменная x.
В Java constructor можно разделить на 3 типа:
Конструкторы без параметров
Дефолтный конструктор
Конструктор с параметрами
Конструктор Java может принимать или не принимать никаких параметров. Если constructor не принимает никаких параметров, он называется без параметров constructor. Например:
private Constructor() { //Тело конструктора }
class Main { int i; //Конструктор без параметров private Main() { i = 5; System.out.println("Объект создан и i = " + i); } public static void main(String[] args) { // Вызов constructor без параметров Main obj = new Main(); } }
вывод:
Объект создан и i = 5
Здесь constructor Main() не принимает никаких параметров.
Вы заметили, что модификатор доступа к constructor Main() является частным (private)?
Это потому, что объект был создан из того же класса. Поэтому, он может получить доступ к constructor.
Но если объект создается вне класса, то constructor должен быть объявлен как public, чтобы к нему можно было получить доступ. Например:
class Company { String domainName; // Публичный конструктор public Company(){ domainName = "oldtoolbag.com"; } } public class Main { public static void main(String[] args) { // В другой классе создается объект Company companyObj = new Company(); System.out.println("Domain name = " + companyObj.domainName); } }
вывод:
Domain name = oldtoolbag.com
Дополнительное чтение: Java доступа修饰ители
Если не создать ни одного конструктора, то компилятор Java автоматически создаст пустой конструктор в runtime. Этот конструктор называется пустым конструктором. Пустой конструктор initializes все неinitialized инстансовые переменные значениями по умолчанию.
Тип | Значения по умолчанию |
---|---|
boolean | false |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
char | \u0000 |
float | 0.0f |
double | 0.0d |
object | null |
class DefaultConstructor { int a; boolean b; public static void main(String[] args) { //Вызов пустого конструктора DefaultConstructor obj = new DefaultConstructor(); System.out.println("a = " + obj.a); System.out.println("b = " + obj.b); } }
вывод:
a = 0; b = false;
В указанном выше коде значения переменных a и b еще не initialized. Но когда мы создаем объект класса, мы можем видеть, что эти значения initialized с определенными значениями.
Это потому, что компилятор Java автоматически создает пустой конструктор. Конструктор initializes значения переменных a и b с помощью значений по умолчанию 0 и false.
Указанный выше код эквивалентен:
class DefaultConstructor { int a; boolean b; //Приватный конструктор private DefaultConstructor() { a = 0; b = false; } public static void main(String[] args) { //Вызов конструктора DefaultConstructor obj = new DefaultConstructor(); System.out.println("a = " + obj.a); System.out.println("b = " + obj.b); } }
вывод:
a = 0; b = false;
Как и с методами, мы можем передавать параметры в конструктор. Такой конструктор называется параметризованным конструктором. Например:
private Constructor(arg1, arg2, ..., argn) { //Тело конструктора }
class Vehicle { int колеса; //Конструктор с одним значением private Vehicle(int колеса){ this.wheels = колеса; System.out.println(колеса + " колёсный транспорт создан."); } public static void main(String[] args) { //Вызов конструктора, передавая единственное значение Vehicle v1 = new Vehicle(2); Vehicle v2 = new Vehicle(3); Vehicle v3 = new Vehicle(4); } }
вывод:
Создан двуколесный vehicle. Создан трехколесный vehicle. Создан четырехколесный vehicle.
В предыдущем примере у нас есть конструктор под названием Vehicle(). Конструктор принимает параметр под названием wheels.
Здесь, при создании объекта, мы передаем параметры конструктору. И на основе параметров он генерирует вывод.
Как и в перегрузке методов, мы можем перегружать конструкторы в Java. Если вы не знакомы с перегрузкой методов, пожалуйста, обратитесь кJava перегрузка методов.
В перегрузке конструкторов может быть два или более конструкторов с различными параметрами. Например,
class Company { String domainName; //Конструктор без параметров public Company(){ this.domainName = "default"; } //Конструктор с одним параметром public Company(String domainName){ this.domainName = domainName; } public void getName(){ System.out.println(this.domainName); } public static void main(String[] args) { //Использование конструктора без параметров Company defaultObj = new Company(); //Использование конструктора с одним параметром Company w3codeboxObj = new Company("oldtoolbag.com"); defaultObj.getName(); w3codeboxObj.getName(); } }
вывод:
default oldtoolbag.com
В предыдущем примере у нас есть два конструктора: public Company() и public Company(String domainName).
Здесь, два конструктора инициализируют переменную domainName различными значениями.Таким образом, в зависимости от необходимых нам значений, мы можем вызывать конструкторы из метода main().
Обратите внимание, что мы используем ключевое слово this для указания переменных класса. Для получения更多信息 о ключевом слове this посетитеJava ключевое слово this.
Конструкторы вызываются автоматически при создании объекта.
Два правила создания конструкторов:
Имя конструктора должно быть таким же, как и имя класса.
Конструкторы Java не могут иметь тип возвращаемого значения.
Если класс не имеет конструкторов, компилятор Java автоматически создаст их при выполнении.Дефолтный конструктор. Дефолтные конструкторы инициализируют переменные объекта значениями по умолчанию. Например, переменные типа int будут инициализированы значением 0
Типы конструкторов:
Конструкторы без параметров - Конструкторы, не принимающие никаких параметров
Дефолтный конструктор - Если конструктор не был явно определен, компилятор Java автоматически создаст его.
Параметризованные конструкторы - Конструкторы с параметрами
Конструкторы не могут быть абстрактными abstract, static или final.
Конструкторы могут быть перегружены, но не могут быть переопределены.