Java. Урок 20. Конструктор

Уроки для начинающих   24 Январь 2013  Автор статьи:  

Самой важной функцией в любом классе является конструктор. Он позволяет создавать экземпляр объекта. Если у вас нет конструктора, то создается конструктор по умолчанию:

1
2
3
4
5
6
7
8
public class User {
    int age;//поле
    String firstName;//поле
    String lastName;//поле
    User() {//вот так выглядит конструктор по умолчанию
        //пусто
    }
}

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

1
2
3
4
5
6
7
8
9
10
public class User {
    int age;//поле
    String firstName;//поле
    String lastName;//поле
    public User(int age, String firstName, String lastName) {//конструктор с тремя параметрами
        this.age = age;
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

Очевидно, что конструкторы вызываются в момент создания объекта:

1
User user = new User(18,"Bendjamin","Button");

Таким образом, мы создали объект класса User, поле Age, которого содержит значения 18, firstName Bendjamin, а lastName Button.
Использование данного конструктора намного удобнее, чем если бы мы пытались сделать это в ручную:

1
2
3
4
User user = new User();
user.age = 18;
user.firstName = "Bendjamin";
user.lastName = "Button";

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

1
User user = new User();//ошибка, конструктор по умолчанию отсутствует

Перейдем к некоторым плюшкам intellij idea. Нажмем alt+insert:
alt-insert-java
Это меню автоматической генерации некоторых полезных вещей для класса. Нас здесь сегодня интересует пункт Constructor. Теперь если у вас в классе есть поля, то можно выбрать от каких полей нужно создать конструктор и среда программирования сама за вас напишет его код. Если вам нужен еще один конструктор, то опять нажмите заветные кнопочки и добавьте еще один:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class User {
    int age;//поле
    String firstName;//поле
    String lastName;//поле
    public User(int age, String firstName, String lastName) {
        this.age = age;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public User(int age) {
        this.age = age;
    }
}

Теперь рассмотрим странную строчку this.названиеПеременной = названиеПеременной. Ключевое слово this показывает, что необходимо текущему экземпляру класса присвоить значение, переданное в конструктор. Таким образом, если мы бы писали вне класса, то user.age = age, где age это обычная переменная.
Внутри конструкторов можно вызывать другие конструкторы, например:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class User {
    int age;//поле
    String firstName;//поле
    String lastName;//поле

    public User(int age, String firstName, String lastName) {
        this.age = age;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public User(int age) {
        this(age,"unknown", "unknown");//вызываю конструктор от трех параметров
    }
}

[note]Кроме того, если в вашем классе использовалось наследование, то для того, чтобы вызвать конструктор родителя необходимо применять ключевое слово super[/note]
Конструкторы нужны для начальной настройки объекта, если необходимо произвести какие — то действия с полями, например проинициализировать их.

  • Мария

    Почему в одном конструкторе нельзя использовать одновременно «super» и «this»?

    • http://cybern.ru/ lordrp

      Т.к это полный бред. Ты либо говоришь, что вызываешь конструктор этого же класса с помощью this, либо с помощью super вызываешь конструктор класса родителя. Одновременно использую super и this ты создаешь неопределенность в вызовах конструктора. Например у нас есть класс человек, который содержит поля имя и возраст, соответственно у него есть конструктор, который принимает name и age на вход. Затем создаешь класс студент, который будет наследоваться от класса человек, но иметь дополнительное поле курс. Очевидно, что у студента может быть несколько конструкторов, допустим, у него их 3. Student(name) Student(name, age) Student(name, age, course). Очевидно, что первый конструктор может вызвать конструктор класса Human c какими-то параметрами, например super(name, 17). Второй конструктор должен вызывать родителя так super(name,age), а третий может не вызывать родителя, а вызвать второй конструктор, а затем внести свои изменения: this(name,age); this.course = course;Если бы я вызвал где-то одновременно и super и this, то в результате бы получилось, что я два раза вызываю super, что достаточно глупо, примерно из таких соображений и нельзя использовать одновременно super и this.

  • Роман

    Следующий урок — 21 Наследование открывается в виде абракадабры ))
    А очень хочется прочесть :)

Научиться программировать

  • на Delphi

  • на Java

  • на C++