Наследование в языке программирования Java

Есть два фундаментальных механизма для построения новых классов из существующих: наследование и агрегация. Есть смысл унаследоваться от существующего класса Vehicle при определении класса Car, потому что автомобиль - это транспортное средство. Класс Vehicle имеет несколько частей, поэтому имеет смысл определить композитный объект (composite object) класса Vehicle, который бы образовывал одно целое из объектов классов Engine, Axle, и GearBox из которых делается транспортное средство.

Наследование нового класса с помощью extend

Поля определенные в суперклассе как private не доступны из подклассов. Чтобы поле было доступно его нужно определить как protected.

// File: CharStack.java
public class CharStack {
  // Instance variables:
  protected char[] stackArray;   // The array implementing the stack.
  protected int    topOfStack;   // The top of the stack.

  // Static variable
  private static int counter;

  // Constructor now increments the counter for each object created.
  public CharStack(int capacity) {
    stackArray = new char[capacity];
    topOfStack = -1;
    counter++;
  }

  // Instance methods:
  public void push(char element) { stackArray[++topOfStack] = element; }
  public char pop() { return stackArray[topOfStack--]; }
  public char peek() { return stackArray[topOfStack]; }
  public boolean isEmpty() { return topOfStack == -1; }
  public boolean isFull() { return topOfStack == stackArray.length - 1; }

  // Static method
  public static int getInstanceCount() { return counter; }
}

В Java подкласс может расширять только один суперкласс.

// File: PrintableCharStack.java
public class PrintableCharStack extends CharStack {

  // Instance method
  public void printStackElements() {
    for (int i = 0; i <= topOfStack; i++)
      System.out.print(stackArray[i]); // print each char on terminal
    System.out.println();
  }

  // Constructor calls the constructor of the superclass explicitly.
  PrintableCharStack(int capacity) { super(capacity); }
}

Класс PrintableCharStack называется подклассом, а класс CharStack называется суперклассом. CharStack является обобщением (generalization) всех символьных стеков, а класс PrintableCharStack является специализацией (specialization) символьного стека позволяющей печатать его элементы.

Объекты класса PrintableCharStack будут отвечать на сообщения также как и объекта класса CharStack, но будут иметь дополнительную функциональность определенную в подклассе.

PrintableCharStack pcStack = new PrintableCharStack(3);
pcStack.push('H');
pcStack.push('i');
pcStack.push('!');
pcStack.printStackElements(); // Prints “Hi!” on the terminal


Комментариев нет:

Отправить комментарий