Menu
Coddy logo textTech

Перегрузка конструкторов

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 8 из 87.

Перегрузка конструкторов означает наличие нескольких конструкторов с разными списками параметров. Используйте this() для вызова одного конструктора из другого.

Несколько конструкторов

public class Book {
    private String title;
    private String author;
    private int pages;
    
    public Book(String title, String author, int pages) {
        this.title = title;
        this.author = author;
        this.pages = pages;
    }
    
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
        this.pages = 0;
    }
}

Цепочка вызовов конструкторов с this()

public class Book {
    private String title;
    private String author;
    private int pages;
    
    public Book(String title, String author, int pages) {
        this.title = title;
        this.author = author;
        this.pages = pages;
    }
    
    public Book(String title, String author) {
        this(title, author, 0);  // Вызывает конструктор с 3 параметрами
    }
    
    public Book() {
        this("Unknown", "Unknown");  // Вызывает конструктор с 2 параметрами
    }
}

Использование

Book b1 = new Book("1984", "Orwell", 328);
Book b2 = new Book("Dune", "Herbert");
Book b3 = new Book();

this() должен быть первым оператором в конструкторе. Цепочка вызовов позволяет избежать дублирования логики присваивания между конструкторами.

challenge icon

Задание

Средне

Создайте три перегруженных конструктора для класса Product, используя цепочку конструкторов:

  • Конструктор с 3 параметрами: name, price, stock
  • Конструктор с 2 параметрами: name, price (stock по умолчанию равен 0)
  • Конструктор по умолчанию: без параметров (name = "Unknown", price = 0, stock = 0)

Используйте this() для вызова конструкторов по цепочке и избежания дублирования кода.

Шпаргалка

Перегрузка конструкторов позволяет иметь несколько конструкторов с различными списками параметров в одном и том же классе.

Пример использования нескольких конструкторов:

public class Book {
    private String title;
    private String author;
    private int pages;
    
    public Book(String title, String author, int pages) {
        this.title = title;
        this.author = author;
        this.pages = pages;
    }
    
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
        this.pages = 0;
    }
}

Цепочка конструкторов с использованием this() вызывает один конструктор из другого, чтобы избежать дублирования кода:

public class Book {
    private String title;
    private String author;
    private int pages;
    
    public Book(String title, String author, int pages) {
        this.title = title;
        this.author = author;
        this.pages = pages;
    }
    
    public Book(String title, String author) {
        this(title, author, 0);  // Вызывает конструктор с 3 параметрами
    }
    
    public Book() {
        this("Unknown", "Unknown");  // Вызывает конструктор с 2 параметрами
    }
}

Использование:

Book b1 = new Book("1984", "Orwell", 328);
Book b2 = new Book("Dune", "Herbert");
Book b3 = new Book();

Важно: this() должен быть первым оператором в конструкторе.

Попробуйте сами

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        double price = Double.parseDouble(scanner.nextLine());
        int stock = Integer.parseInt(scanner.nextLine());
        
        Product product1 = new Product(name, price, stock);
        Product product2 = new Product("Keyboard", 79.99);
        Product product3 = new Product();
        
        System.out.println("Product 1: " + product1.getName() + " - $" + product1.getPrice() + " (Stock: " + product1.getStock() + ")");
        System.out.println("Product 2: " + product2.getName() + " - $" + product2.getPrice() + " (Stock: " + product2.getStock() + ")");
        System.out.println("Product 3: " + product3.getName() + " - $" + product3.getPrice() + " (Stock: " + product3.getStock() + ")");
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование