Урок 8

Наследование

1. Что такое наследование?

  1. Используя наследование, можно создать класс, который определяет характеристики, общие для набора связанных элементов.
  2. Затем этот общий класс может наследоваться другими, более специализированными классами, каждый из которых будет добавлять свои особые характеристики.
  3. В терминологии Jаvа наследуемый класс называется суперклассом, а наследующий класс – подклассом.
  4. Подкласс наследует все члены, определенные в суперклассе, добавляя к ним собственные, особые элементы.
  5. Для каждого создаваемого подкласса можно указать только один суперкласс.
  6. Класс не может стать суперклассом для самого себя.
  7. Набор классов, связанных отношением наследования, называют иерархией.

Общая форма объявления класса, который наследуется от суперкласса:

class имяПодкласса extends имяСуперКласса {
   // тело класса
}

Пример 1. Наследование

 Пример наследования

 

public class Box6 {
    double width;
    double height;
    double depth;

    Box6(double w, double h, double d) {
        width = w;
        height = h;
        depth = d;
    }

    public Box6() {
        width = -1;  // используем -1 для
        height = -1; // обозначения непроинициализированной
        depth = -1;  // коробки
    }

    Box6(double len) {
        width = len;
        height = len;
        depth = len;
    }

    // подсчитать объем коробки
    double getVolume() {
        return width * height * depth;
    }
}
public class ColorBox extends Box6 {
    String color; // цвет коробки

    public ColorBox(int width, int height, int depth, String color) {
        this.width = width;
        this.height = height;
        this.depth = depth;
        this.color = color; // цвет
    }

    public ColorBox() {
    }
}
public class HeavyBox extends Box6 {
    int weight; // вес коробки

    public HeavyBox() {
    }

    public HeavyBox(int width, int height, int depth, int weight) {
        this.width = width;
        this.height = height;
        this.depth = depth;
        this.weight = weight;
    }
}
public class DifferentBoxDemo1 {
    public static void main(String[] args) {
        Box6 box = new Box6(15, 10, 25);
        HeavyBox heavyBox = new HeavyBox(15, 10, 20, 5);
        ColorBox colorBox = new ColorBox(25, 12, 20, "красный");

        System.out.println("Объём коробки: " + box.getVolume());
        System.out.println("Объём коробки: " + heavyBox.getVolume()
                + " Вес коробки: " + heavyBox.weight);
        System.out.println("Объём коробки: " + colorBox.getVolume()
                + " Цвет коробки: " + colorBox.color);
    }
}

2. Доступ к членам класса и наследование

Несмотря на то что подкласс включает в себя все члены своего суперкласса, он не может иметь доступ к тем членам суперкласса, которые объявлены как private.

Пример 2. Доступ к членам класса и наследование

public class A {
    public int value1;
    private int value2;
}
public class B extends A {
    public int sum() {
        // return value1 + value2;
        return value1;
    }
}

3. Переменная суперкласса может ссылаться на объект подкласса

Ссылочной переменной из суперкласса может быть присвоена ссылка на любой подкласс, производный от этого суперкласса:

Box heavyBox = new HeavyBox(15, 10, 20, 5);
Box colorBox = new ColorBox(25, 12, 20, "красный"); 

Доступные члены класса определяются типом ссылочной переменной, а не типом объекта, на который она ссылается.

Пример 3. Переменная суперкласса может ссылаться на объект подкласса

public class DifferentBoxDemo2 {
    public static void main(String[] args) {
        Box6 box = new Box6(15, 10, 25);
        Box6 heavyBox = new HeavyBox(15, 10, 20, 5);
        Box6 colorBox = new ColorBox(25, 12, 20, "красный");

        System.out.println("Объём коробки: " + box.getVolume());
        System.out.println("Объём коробки: " + heavyBox.getVolume());
        System.out.println("Объём коробки: " + colorBox.getVolume());
        //System.out.println(" Вес коробки: " + heavyBox.weight);
        //System.out.println(" Цвет коробки: " + colorBox.color);
    }
}

4. Создание многоуровневой иерархии

Можно строить иерархии, состоящие из любого количества уровней наследования.

Создание многоуровневой иерархии

Пример 4. Многоуровневая иерархии

public class Shipment extends HeavyBox1 {
    public double cost;

    public Shipment(int width, int height, int depth, int weight, double cost) {
        super(width, height, depth, weight);
        this.cost = cost;
    }

    public Shipment(double cost) {
        this.cost = cost;
    }
}
public class DemoShipment {
    public static void main(String[] args) {
        Shipment shipment = new Shipment(2, 3, 4, 5, 5.3);

        System.out.println(shipment.cost);
        System.out.println(shipment.depth);
        System.out.println(shipment.height);
        System.out.println(shipment.weight);
        System.out.println(shipment.width);
    }
}

Порядок вызова конструкторов:

  1. Метод super() всегда ссылается на конструктор ближайшего по иерархии суперкласса.
  2. В иерархии классов конструкторы выполняются в порядке наследования, начиная с суперкласса и кончая подклассом.
  3. Этот порядок остается неизменным независимо от того, используется форма super() или нет.
  4. Если super() не вызывается, то используется конструктор по умолчанию или же конструктор без параметров из каждого суперкласса.
  5. Если в иерархии классов требуется передать параметры конструктору суперкласса, то все подклассы должны передавать эти параметры вверх по иерархии.

Пример 5. Порядок вызова конструкторов

public class E {
    public E() {
        System.out.println("В конструкторе E");
    }
}
public class F extends E {
    public F() {
        System.out.println("В конструкторе F");
    }
}
public class G extends F {
    public G() {
        System.out.println("В конструкторе G");
    }
}
public class CallingConstructors {
    public static void main(String[] args) {
        G g = new G();
    }
}



0 comments
Leave your comment: