От абстрактного класса невозможно создать объект. В абстрактном классе могут быть абстрактные методы - методы, которые не имеют реализации. Такие методы должны быть реализованы в классе-наследнике:
// Animal.java
public abstract class Animal {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void go() {
System.out.println("I wake up.");
}
private void die() {
System.out.println("ANIMAL: I die.");
}
void born() {
System.out.println("ANIMAL: I have been born.");
}
public abstract void eat();
}
Класс Dog
наследуется от Animal
. В него добавляется метод bite()
, уникальный для собаки.
Методы go()
и eat()
переопределены, для каждого класса-наследника может быть своя реализация.
Невозможно переопределить методы с видимостью private
или без определённого (default
) типа видимости.
// Dog.java
public final class Dog extends Animal {
public void bite() {
System.out.println("DOG: I bite.");
}
@Override
public void go() {
super.go(); // Вызов метода из базового класса
System.out.println("Dog: I go.");
}
@Override
public void eat() {
System.out.println("DOG: I eat.");
}
}
Класс Frog
наследуется от Animal
. В него добавляется метод jump()
, уникальный для лягушки.
// Frog.java
public class Frog extends Animal {
public void jump() {
System.out.println("FROG: I jump.");
}
@Override
public void go() {
super.go(); // Вызов метода из базового класса
System.out.println("FROG: I go.");
}
@Override
public void eat() {
System.out.println("FROG: I eat.");
}
}
// Example.java
public class Example {
public static void main(String[] args) {
// problem
// Animal frog = new Frog();
// frog.setX(1);
// frog.setY(1);
// frog.go();
// frog.eat();
// Вызывать метод jump у объекта типа Animal не получится, такого метода у родительского класса нет
// frog.jump();
// Animal dog = new Dog();
// dog.setX(3);
// dog.setY(2);
// dog.go();
// dog.eat();
// Вызывать метод bite у объекта типа Animal не получится
// dog.bite();
List<Animal> animals = List.of(new Frog(), new Dog());
for (Animal animal : animals) {
animal.go();
}
for (Animal animal: animals) {
animal.eat();
}
// Dog and Frog extends Animal
// super
// abstract
}
}
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.