popov . dev

Main

Library

Articles

Абстрактный клас...

Абстрактный класс Java и абстрактные методы

В данном руководстве мы познакомимся с абстрактными классами и методами Java с помощью примеров. Мы также узнаем об абстракции в Java. В Java мы не можем создать экземпляр абстрактного класса (мы не можем создавать объекты абстрактных классов). Для объявления абстрактного класса используется ключевое слово abstract, например:

// создание абстрактного класса
abstract class Language {
    // свойства и методы
}
...

// попытка создать объект Language
// вызывает ошибку
Language obj = new Language();

Абстрактный класс может иметь как обычные, так и абстрактные методы. Например:

abstract class Language {

    // абстрактный метод
    abstract void method1();

    // обычный метод
    void method2() {
        System.out.println("Это обычный метод");
    }
}

Абстрактный метод Java

Метод, у которого нет тела, называется абстрактным методом. Мы используем одно и то же ключевое слово abstract для создания абстрактных методов. Например:

abstract void display();

Здесь display() - это абстрактный метод. Тело метода display() заменено на ;.

Если класс содержит абстрактный метод, то класс тоже должен быть абстрактным. В противном случае он выдаст ошибку. Например:

// Ошибка
// класс должен быть абстрактным
class Language {

    // абстрактный метод
    abstract void method1();
}

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

abstract class Language {
    // метод абстрактного класса
    public void display() {
        System.out.println("Это язык Java");
    }
}

class Main extends Language {
    public static void main(String[] args) {
    
        // создание объекта Main
        Main obj = new Main();

        // доступ к методу абстрактного класса
        // используя объект класса Main
        obj.display();
    }
}

Вывод:

Это язык Java

В приведенном выше примере мы создали абстрактный класс с именем Language. Класс содержит обычный метод display(). Мы создали основной класс, который наследует абстрактный класс. Обратите внимание на инструкцию:

obj.display();

Здесь obj является объектом дочернего класса Main. Мы вызываем метод абстрактного класса, используя объект obj.

Если абстрактный класс включает в себя какой-либо абстрактный метод, то все дочерние классы, унаследованные от абстрактного суперкласса, должны обеспечивать реализацию абстрактного метода. Например:

abstract class Animal {
    abstract void makeSound();

    public void eat() {
        System.out.println("Я могу есть.");
    }
}

class Dog extends Animal {

    // создаем реализацию абстрактного метода
    public void makeSound() {
        System.out.println("Гав гав");
    }
}

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

        // создание объекта класса Dog
        Dog d1 = new Dog();

        d1.makeSound();
        d1.eat();
    }
}

Вывод:

Гав гав
Я могу есть

В приведенном выше примере мы создали абстрактный класс Animal. Класс содержит абстрактный метод makeSound() и неабстрактный метод eat(). Мы унаследовали подкласс Dog от суперкласса Animal. Здесь подкласс Dog предоставляет реализацию абстрактного метода makeSound(). Затем мы использовали объект d1 класса Dog для вызова методов makeSound() и eat().

Примечание: Если класс Dog не обеспечивает реализацию абстрактного метода makeSound(), Dog также должен быть объявлен как абстрактный. Это связано с тем, что подкласс Dog наследует makeSound() от Animal.

Абстрактный класс может иметь конструкторы, подобные обычным классам. И мы можем получить доступ к конструктору абстрактного класса из подкласса, используя ключевое слово super. Например:

abstract class Animal {
   Animal() {
      ….
   }
}

class Dog extends Animal {
    Dog() {
        super();
        ...
    }
}

Здесь мы использовали super() внутри конструктора Dog для доступа к конструктору Animal.

Абстракция в Java

Основное применение абстрактных классов и методов заключается в достижении абстракции в Java.

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

Давайте рассмотрим пример, который поможет нам лучше понять абстракцию Java.

abstract class MotorBike {
    abstract void brake();
}

class SportsBike extends MotorBike {
    // реализация абстрактного метода
    public void brake() {
        System.out.println("Тормоз SportsBike");
    }
}

class MountainBike extends MotorBike {
    // реализация абстрактного метода
    public void brake() {
        System.out.println("Тормоз MountainBike");
    }
}

class Main {
    public static void main(String[] args) {
        MountainBike m1 = new MountainBike();
        m1.brake();
        SportsBike s1 = new SportsBike();
        s1.brake();
    }
}

Вывод:

Тормоз MountainBike
Тормоз SportsBike

В приведенном выше примере мы создали абстрактный суперкласс MotorBike. Суперкласс MotorBike имеет абстрактный метод brake().

Метод brake() не может быть реализован внутри MotorBike. Это связано с тем, что у каждого велосипеда разная реализация тормозов. Таким образом, все подклассы MotorBike будут иметь разную реализацию brake().

Таким образом, реализация функции brake() в MotorBike остается скрытой.

Здесь MountainBike использует свою собственную реализацию функции brake(), а SportsBike использует свою собственную реализацию функции brake().

Заметки:

  • Мы используем ключевое слово abstract для создания абстрактных классов и методов.
  • Абстрактный метод не имеет никакой реализации (тела метода).
  • Класс, содержащий абстрактные методы, также должен быть абстрактным.
  • Мы не можем создавать объекты абстрактного класса.
  • Чтобы реализовать функции абстрактного класса, мы наследуем от него подклассы и создаем объекты этого подкласса.
  • Подкласс должен переопределять все абстрактные методы абстрактного класса. Однако, если подкласс объявлен абстрактным, переопределять абстрактные методы необязательно.
  • Мы можем получить доступ к статическим атрибутам и методам абстрактного класса, используя ссылку на абстрактный класс.

Comments

In order to leave your opinion, you need to register on the website