English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы изучим абстрактное в Java. Мы изучим абстрактные классы и методы Java, а также как использовать их в программе.
Абстрактный класс — это класс, который не может быть инстанцирован (мы не можем создать объект абстрактного класса). В Java мы используем ключевое слово abstract для объявления абстрактного класса.
abstract class Animal { // Свойства и методы }
Если попытаться создать объект абстрактного класса, то会出现 компиляционная ошибка. Например,
Animal a1 = new Animal()
Это вызовет компиляционную ошибку:
Животное абстрактно; его нельзя инстанцировать
Хотя абстрактные классы не могут быть инстанцированы, мы можем из них создавать подклассы. Мы можем создавать объекты подклассов для доступа к членам абстрактного класса.
Прежде чем详细了解 это, нам нужно понять абстрактные методы.
Мы используем тот же ключевое слово abstract для создания абстрактных методов. Мы声明了一个 абстрактный метод без его реализации. Например,
abstract void makeSound();
Здесь makeSound() является абстрактным методом.
Важно отметить, что в одном абстрактном классе может содержаться только один абстрактный метод. Если мы включаем абстрактный метод в класс, который не является абстрактным, возникает ошибка.Абстрактные классы могут содержать абстрактные и неабстрактные методы. Это пример.
abstract class Animal { public void displayInfo() { System.out.println("Я животное."); } abstract void makeSound(); }
В предыдущем примере мы создали абстрактный класс Animal. Этот класс содержит абстрактный метод makeSound() и неабстрактный метод displayInfo().
Абстрактные классы не могут быть инстанцированы. Для доступа к членам абстрактного класса我们必须 наследовать его. Например
abstract class Animal { public void displayInfo() { System.out.println("Я животное."); } } class Dog extends Animal { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
Вывод:
Я животное.
В предыдущем примере мы создали абстрактный класс Animal. Мы не можем создать объект класса Animal. Для доступа к методу displayInfo() класса Animal мы наследуем его подкласс Dog.
Затем мы используем объект d1 класса Dog для доступа к методу displayInfo().
В Java абстрактные методы superclass должны быть переопределены в подклассе. Это связано с тем, что подкласс наследует абстрактные методы superclass.
Поскольку наш подкласс содержит абстрактные методы, нам нужно переопределить их.
Примечание:Если подкласс также объявлен абстрактным, то не обязательно принудительно переопределять абстрактный метод.
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 d1 = new Dog(); d1.makeSound(); d1.eat(); } }
Вывод:
Гав гав. Я могу есть.
В предыдущем примере мы создали абстрактный класс Animal. Этот класс содержит абстрактный метод makeSound() и неабстрактный метод eat().
Мы наследуем подкласс Dog от класса Superclass Animal. Здесь подкласс Dog переопределяет абстрактный метод displayInfo().
Затем мы создали объект d1 класса Dog. Используя этот объект, мы вызвали методы d1.displayInfo() и d1.eat().
Как и в случае с неабстрактными классами, мы используем ключевое слово super для доступа к конструктору абстрактного класса из подкласса. Например:
abstract class Animal { Animal() { ... } } class Dog extends Animal { Dog() { super(); ... } }
Здесь мы используем super() в конструкторе Dog для доступа к конструктору класса Animal.
Обратите внимание, что super всегда должно быть первым выражением в конструкторе подкласса. ДоступJava-суперключевые словаДля получения дополнительной информации.
Абстракция - это важное concepto в面向对象的 программировании. Абстракция показывает только необходимые данные, все ненужные детали остаются скрытыми. Это позволяет нам управлять сложностью, упрощая и скрывая детали с помощью более простых и продвинутых идей.
Реальный пример абстракции может быть тормозами мотоцикла. Мы знаем, что такое торможение. Когда мы жмем на тормоз, мотоцикл останавливается. Но работа тормозов для нас скрыта.
Одним из главных преимуществ скрытия работы тормозов является то, что теперь производитель может использовать разные тормоза для различных мотоциклов, но функция тормозов остается прежней.
Давайте рассмотрим пример, чтобы лучше понять абстракцию в Java.
abstract class Animal { abstract void makeSound(); } class Dog extends Animal { public void makeSound() { System.out.println("Гав гав."); } } class Cat extends Animal { public void makeSound() { System.out.println("Мяу"); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.makeSound(); Cat c1 = new Cat(); c1.makeSound(); } }
Вывод:
Гав гав Мяу
В приведенном выше примере мы создали суперкласс Animal. Суперкласс Animal имеет абстрактный метод makeSound().
Метод makeSound() не может быть реализован внутри класса Animal. Это связано с тем, что каждый вид животных издает разные звуки. Поэтому, все подклассы Animal имеют различные реализации метода makeSound().
Мы не можем реализовать makeSound() в Animal так, чтобы это было правильно для всех подклассов Animal. Поэтому реализация makeSound() в Animal остается скрытой.
В примере выше, Dog реализует свой собственный makeSound() метод, Cat реализует свой собственный makeSound() метод.
Мы используем ключевое слово abstract для создания абстрактных классов и методов.
Абстрактные методы не имеют реализации (тела метода).
Класс, содержащий абстрактные методы, также должен быть абстрактным.
Мы не можем создать объект абстрактного класса.
Чтобы реализовать функциональность абстрактного класса, мы наследуем его подкласс и создаем объект этого подкласса.
Подклассы должны переопределять все абстрактные методы абстрактного класса. Но если подкласс объявлен как абстрактный, то не обязательно переопределять абстрактные методы.
Мы можем использовать ссылку на абстрактный класс для доступа к статическим свойствам и методам абстрактного класса. Например:
Animal.staticMethod();
В Java интерфейсы подобны абстрактным классам. Но интерфейсы не имеют неабстрактных методов. В следующем уроке мы изучим больше о интерфейсах.