JavaRush/Java блог/Random/Инициализация полей
Автор
Pavlo Plynko
Java-разработчик в CodeGym

Инициализация полей

Статья из группы Random
участников
Приветствую, коллеги. Решил показать несколько способов инициализации полей в Java. Статья может быть полезна тем, кто только начал изучать программирование. Инициализация полей - 1Для запуска демонстрационных примеров создадим Java класс Demo с методом main(). В методе main() выведем что-нибудь на экран, чтобы убедиться, что программа запускается:
public class Demo {
    public static void main(String[] args) {
        System.out.println("Hello JavaRush.");
    }
}
Далее создадим Java класс кота, добавим в него несколько полей: имя, возраст.
class Cat {
    String name;
    int age;
}
В методе main() создадим двух котов. Попробуем вывести на экран их имя и возраст:
public class Demo {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        Cat cat2 = new Cat();

        System.out.println("Имя первого кота: " + cat1.name);
        System.out.println("Возраст первого кота: " + cat1.age);
        System.out.println();
        System.out.println("Имя второго кота: " + cat2.name);
        System.out.println("Возраст второго кота: " + cat2.age);
    }
}

class Cat {
    String name;
    int age;
}
Запустив программу, получим вывод:
Имя первого кота: null
Возраст первого кота: 0

Имя второго кота: null
Возраст второго кота: 0
Так как мы не инициализировали эти поля, они получили значения по умолчанию. String относится к ссылочным типам, а для всех ссылочных типов значение по умолчанию это null. int относится к примитивным типам. У каждого примитивного типа есть свое значение по умолчанию:
Инициализация полей - 2
Как можно передать в наши поля реальные значения (например, имя "Том" и возраст "два года")? Первый способ — инициализировать поля сразу во время объявления:
public class Demo {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        Cat cat2 = new Cat();

        System.out.println("Имя первого кота: " + cat1.name);
        System.out.println("Возраст первого кота: " + cat1.age);
        System.out.println();
        System.out.println("Имя второго кота: " + cat2.name);
        System.out.println("Возраст второго кота: " + cat2.age);
    }
}

class Cat {
    String name = "Том";
    int age = 2;
}
Запускаем программу и видим, что поля инициализированы нашими значениями:
Имя первого кота: Том
Возраст первого кота: 2

Имя второго кота: Том
Возраст второго кота: 2
При этом сколько бы котов мы не создавали, они все будут иметь одинаковые имя и возраст. То есть мы просто поменяли значения null и 0 на “Том” и 2. Следующий способ инициализации – через конструктор. Создадим коту конструктор с двумя параметрами. Обычно имена параметров делают такими же, как и имена полей. В таком случае для обращения к полям нужно использовать слово this, а к параметрам конструктора можно обращаться обычным способом:
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
Еще раз:
Инициализация полей - 3
Добавим также пустой конструктор без параметров, чтобы наш предыдущий пример был работоспособным. В методе main() добавим еще двух котов с помощью конструктора с параметрами.
public class Demo {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        Cat cat2 = new Cat();

        System.out.println("Имя первого кота: " + cat1.name);
        System.out.println("Возраст первого кота: " + cat1.age);
        System.out.println();
        System.out.println("Имя второго кота: " + cat2.name);
        System.out.println("Возраст второго кота: " + cat2.age);

        Cat cat3 = new Cat("Рыжик", 5);
        Cat cat4 = new Cat("Барсик", 9);

        System.out.println();
        System.out.println("Имя третьего кота: " + cat3.name);
        System.out.println("Возраст третьего кота: " + cat3.age);
        System.out.println();
        System.out.println("Имя четвертого кота: " + cat4.name);
        System.out.println("Возраст четвертого кота: " + cat4.age);
    }
}

class Cat {
    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Cat() {
    }
}
Запустим программу:
Имя первого кота: null
Возраст первого кота: 0

Имя второго кота: null
Возраст второго кота: 0

Имя третьего кота: Рыжик
Возраст третьего кота: 5

Имя четвертого кота: Барсик
Возраст четвертого кота: 9
Как видим, созданные таким способом коты обладают большей индивидуальностью. Существуют и другие способы инициализации полей в Java, но, для начала достаточно и этих.
Комментарии (15)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Andrey Kuimov
Уровень 2
14 ноября 2021, 08:37
качественно и просто объяснил. спасибо! отдельное спасибо за картинку с надписями полей и параметров конструктора!
Pavlo Plynko Java-разработчик в CodeGym Expert
15 ноября 2021, 15:15
пожалуйста )
Anton
Уровень 10
Expert
13 апреля 2021, 04:50
Здравствуйте. Спасибо за статью, сразу всё стало понятно, кроме внезапно появившейся в тексте фразы без объяснений: "Добавим также пустой конструктор без параметров, чтобы наш предыдущий пример был работоспособным" Зачем он там? Почему он не будет работать без него? Можно ответить в виде ссылки на статью...
Pavlo Plynko Java-разработчик в CodeGym Expert
13 апреля 2021, 06:02
Привет! Если в коде используется запись типа new Cat(), т.е. именно с пустыми круглыми скобками, то у класса Cat может быть два варианта: 1) в классе Cat нет явно описанных конструкторов. В этом случае у него будет конструктор по умолчанию (без параметров), т.е. ничего дополнительно делать не надо. 2) у класса Cat есть описанные конструкторы с какими-либо параметрами. В этом случае конструктора по умолчанию не будет, и надо описать его явно. Т.к. в примере был добавлен конструктор с параметрами ( public Cat(String name, int age) ), а в коде использовался вызов new Cat(), то пришлось добавить конструктор без параметров, иначе была бы ошибка компиляции. Т.е. строки 33, 34 нужны были для того,чтобы работали строки 3, 4.
Zhanna
Уровень 20
25 августа 2020, 13:37
😀
Pavel Frontend Developer
22 декабря 2019, 17:22
не совсем понял, если можно поясните, разницу между созданием конструктора с параметрами и без
Pavlo Plynko Java-разработчик в CodeGym Expert
23 декабря 2019, 06:09
Конструкторы объявляются одинаково:
public class Cat {

    private String name;

    public Cat() {
         this.name = "default name";
    }

    public Cat(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public static void main(String[] args) {
        Cat defaultCat = new Cat();
        Cat customCat1 = new Cat("custom name 1");
        Cat customCat1 = new Cat("custom name 2");
    }
}
Но если в классе нет других конструкторов, то пустой конструктор без параметров объявлять не обязательно, он и так будет, "по умолчанию":
public class Cat {

    public String name;

    public Cat() {} // лишнее в данном случае, все бы работало и без этого объявления

    public static void main(String[] args) {
        Cat cat = new Cat();
    }
}
А если у класса есть другие конструкторы, то чтобы воспользоваться конструктором без параметров, его нужно тоже явно объявить:
public class Cat {

    private String name;

    public Cat(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public static void main(String[] args) {
        Cat cat = new Cat(); // ошибка компиляции, так как не объявлен конструктор без параметров, и есть другие конструкторы
    }
}
Juli
Уровень 13
16 февраля 2022, 10:33
Подскажите, пожалуйста, для чего объявлен конструктор getName?
Pavlo Plynko Java-разработчик в CodeGym Expert
18 февраля 2022, 07:15
Это не коструктор, а так называемый "геттер" поля name. Он нужен для того чтобы получать значение приватного поля. В данном примере он не играет роли. Просто без него класс получается немного бессмылсенным: имя у кота есть, но узнать его никак нельзя.
13 декабря 2019, 17:12
Cпасибо
Олег Коньшин
Уровень 16
1 мая 2018, 20:35
А можно инициализировать вот так: Cat cat3 = new Cat("Рыжик", 5); не создавая конструктор?
Pavlo Plynko Java-разработчик в CodeGym Expert
1 мая 2018, 21:38
Нет, будет ошибка компиляции, IDEA красным подчеркнет.
Олег Коньшин
Уровень 16
2 мая 2018, 19:37
спасибо
Alexander DevOps
11 марта 2021, 17:40
Да, у меня отработало. Dog myDogOne = new Dog("Бобик" ,11); Dog myDogTwo = new Dog("Жучка" ,2);
Pavlo Plynko Java-разработчик в CodeGym Expert
12 марта 2021, 06:11
Раз отработало, значит ты создал соотв. конструктор :)