Использование extends в Java: примеры и пояснения

🔥 🚀 Важно для всех, кто работает с Java! 🔥
На JavaRocks ты найдешь уникальные туториалы, практические задачи и редкие книги, которых не найти в свободном доступе. Присоединяйся к нашему Telegram-каналу JavaRocks — стань частью профессионального сообщества!

Что такое ключевое слово extends в Java?

Ключевое слово extends в Java используется для реализации наследования: один класс (дочерний) наследует свойства и поведение другого (родительского). Когда класс наследуется с помощью extends, он получает все свойства и методы родительского класса. Ключевое слово используется при объявлении класса: сначала имя дочернего класса, потом extends, а потом — имя родительского. Это выглядит следующим образом.

class ParentClass{ ...}

class ChildClass extends ParentClass { ... }
Run Code

Что такое наследование в Java?

Прежде чем использовать extends, стоит разобраться, что вообще такое наследование в контексте Java.

Java – это язык объектно-ориентированного программирования (ООП). Объектно-ориентированное программирование — это подход к созданию программ, основанный на использовании классов и объектов. Между классами могут существовать определённые отношения, и одно из таких отношений — наследование.

Наследование описывает связь типа “является” (Is-A-Relationship) между объектами. Это механизм, с помощью которого один класс перенимает свойства и поведение другого. Класс, который наследуется, называется родительским или суперклассом, а класс, который наследует — дочерним или подклассом.

Extends в Java — это ключевое слово, с помощью которого реализуется наследование между классами.

Пример применения ключевого слова extends

class Animal {
    String name;
    String sound;
    int noOfLegs;

    public Animal (){}

  
    public Animal (String name, String sound, int legs){
        this.name = name;
        this.sound = sound;
        this.noOfLegs = legs;
    }

  
    public void display() {
        System.out.println("My name is " + name);
        System.out.println("My sound is " + sound);
        System.out.println("My no. of legs is " + noOfLegs);
    }
}


class Dog extends Animal {
    String color;
    String breed;
  

    public Dog(String name, String sound ,int legs, String color, String breed){
        super(name,sound,legs);
        this.color = color;
        this.breed = breed;
    }

    public void display() {
        super.display();
        System.out.println("My color is " + color);
        System.out.println("My breed is " + breed);

    }
}

public class Main {
    public static void main(String[] args) {

    
    Dog dog1 = new Dog("Billy","Bark",4,"Brown","Labrador");

    dog1.display();

    System.out.println("------------------");

    Dog dog2 = new Dog("Grace","Bark",4,"Black","Husky");

    dog2.display();

    System.out.println("------------------");

    Dog dog3 = new Dog("Hugo","Bark",4,"Gray","Poodle");

    dog3.display();


    }
}
Run Code

Что выведется в консоль:

My name is Billy
My sound is Bark
My no. of legs is 4
My color is Brown
My breed is Labrador
------------------
My name is Grace
My sound is Bark
My no. of legs is 4
My color is Black
My breed is Husky
------------------
My name is Hugo
My sound is Bark
My no. of legs is 4
My color is Gray
My breed is Poodle

Пояснение

В приведённом выше фрагменте кода показано, как работает наследование в Java с использованием ключевого слова extends.

Есть два класса: родительский — Animal, и дочерний — Dog. Класс Dog наследуется от Animal, то есть получает доступ ко всем его свойствам и методам.
Благодаря наследованию, дочернему классу не нужно заново описывать то, что уже реализовано в родительском — это экономит время и делает код более чистым и повторно используемым.

Примеры переопределения методов в Java

Когда в подклассе заново реализуется метод, уже описанный в родительском классе — это называется переопределением. Это позволяет адаптировать поведение унаследованных методов.

Пример использования @Override

class Animal {
    void sound() {
        System.out.println("Animals make sounds");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Dogs bark");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog();
        myAnimal.sound(); 
    }
}
Run Code

Совет: всегда используйте аннотацию @Override при переопределении методов. Она гарантирует, что сигнатура метода в подклассе точно совпадает с сигнатурой метода суперкласса, что помогает избежать трудноуловимых ошибок.

Значение ключевого слова super

Ключевое слово super используется для вызова методов или доступа к полям суперкласса. Это особенно актуально, если в подклассе переопределён метод, но при этом всё ещё нужно вызвать его из суперкласса.

Пример использования super при переопределении метода

class Animal {
    void sound() {
        System.out.println("Animals make sounds");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        super.sound(); 
        System.out.println("Dogs bark");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.sound();
        
        
        
    }
}
Run Code

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

Цепочка конструкторов при наследовании

Цепочка конструкторов (constructor chaining) позволяет конструктору подкласса вызвать конструктор суперкласса с помощью ключевого слова super. Это нужно для того, чтобы сначала был инициализирован родительский класс — только потом создаётся объект подкласса.

Пример цепочки вызовов конструкторов

class Animal {
    Animal(String name) {
        System.out.println("Animal constructor: " + name);
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name); 
        System.out.println("Dog constructor: " + name);
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog("Buddy");
        
        
        
    }
}
Run Code

Совет: при использовании конструктора подкласса всегда вызывайте super() первым, чтобы корректно инициализировать родительский класс.

Заключение

В этой статье мы разобрали, как применять ключевое слово extends в коде, и рассмотрели основные принципы объектно-ориентированного подхода в Java и наследования. Теперь вы можете применять наследование между классами и создавать новые примеры, чтобы лучше понять, как это работает. Главное — не останавливайтесь на достигнутом и продолжайте развивать свои навыки!

Перевод статьи «Java Extends Keyword with Examples».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх