Abstract class. What is it?

   Абстрактные классы. Что же это? И с чем это едят? Под сырным или укропным соусом? На эти и другие вопросы ответ будет дан ниже.
   Иногда возникает ситуация, когда мы имеем супер класс, большинство его методов используем в подклассах. Супер классы находясь в верхней части иерархии становятся настолько абстрактными, что их можно рассматривать как определенную базу для разработки других классов. В этом случае необходимо создавать абстрактные классы. 
abstract class   На рисунке слева изображена иерархическая цепочка классов, в которой определен абстрактный класс "Насекомое" и пара подклассов.
   Данный класс имеет два подкласса "Жук" и "Муха". Действительно "Жук" и "Муха" являются насекомыми, а обратное утверждение не может быть верным, ибо не каждое насекомое может быть мухой или же жуком.
   С абстрактными классами действительны следующие утверждения:
  • Нельзя использовать конструктор для абстрактного класса.
  • Если в подклассе не определить все методы абстрактного класса, то подкласс так же становится абстрактным.
  • Возможно создание массива абстрактных классов, где элементы массива инициализированы подклассами. При этом у элементов массива возможно вызывать методы только абстрактного класса.
   Обо всем этом далее более подробно.
   Для начала об определении абстрактного класса. Абстрактный класс обозначается в коде следующим образом
    abstract class Insect {

    }
       Абстрактный класс по определению должен содержать абстрактные методы, которые представляют собой прототипы методов, реализованных в подклассах.
       Для класса Insect определим метод getDesctiption(). C его помощью мы получим описание данного объекта.К примеру: Жук богомол любит траву, но и не против полакомиться своими соседями
    public abstract class Insect {
    private String name;

    public Insect(String n){
    this.name = n;
    }

    public String getName(){
    return this.name;
    }

    abstract public String getDecription();
    }
       Чтобы было возможно работать с этим методом, его необходимо определить в подклассе Fly
    public class Fly extends Insect {
    public Fly(String n){
    super(n);
    }

    public String getName() {
    return super.getName();
    }

    /**
    * Переопределенный метод
    */
    @Override
    public String getDecription() {
    return "Жук " + getName() + " любит питаться пальчиками людей";
    }
    }
       Класс Fly уже нельзя назвать абстрактным, так как он определил все методы (точнее один единственный) своего супер класса Insect. Обычно переопределенные методы обозначаются с помощью конструкции @override. Она явно дает знать, что данный метод не собственный у класса, а метод переопределенный.
       Для класса Insect нельзя вызывать конструктор, т.к. это приведет к ошибке:
    new Insect("полоскун");
    Данный код приведет к ошибке. Но без проблем можно создать объект подкласса
    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());
    }
    Здесь мы создаем массив класса Insect, элементы которого инициализируем экземплярами подклассов Fly и Bug и далее вызываем метод 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() + " любит питаться пальчиками людей";
    }
    }
    На этом все! Спасибо:)