Абстрактные классы. Что же это? И с чем это едят? Под сырным или укропным соусом? На эти и другие вопросы ответ будет дан ниже.
Иногда возникает ситуация, когда мы имеем супер класс, большинство его методов используем в подклассах. Супер классы находясь в верхней части иерархии становятся настолько абстрактными, что их можно рассматривать как определенную базу для разработки других классов. В этом случае необходимо создавать абстрактные классы.
На рисунке слева изображена иерархическая цепочка классов, в которой определен абстрактный класс "Насекомое" и пара подклассов.
Данный класс имеет два подкласса "Жук" и "Муха". Действительно "Жук" и "Муха" являются насекомыми, а обратное утверждение не может быть верным, ибо не каждое насекомое может быть мухой или же жуком.
С абстрактными классами действительны следующие утверждения:
- Нельзя использовать конструктор для абстрактного класса.
- Если в подклассе не определить все методы абстрактного класса, то подкласс так же становится абстрактным.
- Возможно создание массива абстрактных классов, где элементы массива инициализированы подклассами. При этом у элементов массива возможно вызывать методы только абстрактного класса.
Для начала об определении абстрактного класса. Абстрактный класс обозначается в коде следующим образом
Для класса Insect определим метод getDesctiption(). C его помощью мы получим описание данного объекта.К примеру: Жук богомол любит траву, но и не против полакомиться своими соседями
Для класса Insect нельзя вызывать конструктор, т.к. это приведет к ошибке:
abstract class Insect {Абстрактный класс по определению должен содержать абстрактные методы, которые представляют собой прототипы методов, реализованных в подклассах.
}
Для класса Insect определим метод getDesctiption(). C его помощью мы получим описание данного объекта.К примеру: Жук богомол любит траву, но и не против полакомиться своими соседями
public abstract class Insect {Чтобы было возможно работать с этим методом, его необходимо определить в подклассе Fly
private String name;
public Insect(String n){
this.name = n;
}
public String getName(){
return this.name;
}
abstract public String getDecription();
}
public class Fly extends Insect {Класс Fly уже нельзя назвать абстрактным, так как он определил все методы (точнее один единственный) своего супер класса Insect. Обычно переопределенные методы обозначаются с помощью конструкции @override. Она явно дает знать, что данный метод не собственный у класса, а метод переопределенный.
public Fly(String n){
super(n);
}
public String getName() {
return super.getName();
}
/**
* Переопределенный метод
*/
@Override
public String getDecription() {
return "Жук " + getName() + " любит питаться пальчиками людей";
}
}
Для класса Insect нельзя вызывать конструктор, т.к. это приведет к ошибке:
new Insect("полоскун");Данный код приведет к ошибке. Но без проблем можно создать объект подкласса
Fly fly = new Fly("Навозная");Несмотря на то, что у абстрактных классов нельзя вызывать конструктор, но переменные абстрактных классов все же можно использовать. Ниже показана эта возможность:
Insect[] insect = new Insect[2];Здесь мы создаем массив класса Insect, элементы которого инициализируем экземплярами подклассов Fly и Bug и далее вызываем метод getDecription(). Ниже весь код программы:
insect[0] = new Fly("Цеце");
insect[1] = new Bug("Усач");
for(Insect i : insect){
System.out.println(i.getDecription());
}
public class TestBug {На этом все! Спасибо:)
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Fly fly = new Fly("Навозная");
Insect[] insect = new Insect[2];
insect[0] = new Fly("Цеце");
insect[1] = new Bug("Усач");
for(Insect i : insect){
System.out.println(i.getDecription());
}
}
}
//Абстрактный класс
public abstract class Insect {
private String name;
public Insect(String n){
this.name = n;
}
public String getName(){
return this.name;
}
abstract public String getDecription();
}
public class Bug extends Insect {
public Bug(String n){
super(n);
}
public String getName(){
return super.getName();
}
@Override
public String getDecription() {
return getName() + " спаситель черепах";
}
}
public class Fly extends Insect {
public Fly(String n){
super(n);
}
public String getName() {
return super.getName();
}
/**
* Переопределенный метод
*/
@Override
public String getDecription() {
return "Жук " + getName() + " любит питаться пальчиками людей";
}
}