Урок 9. Основы языка JAVA. Наследование в java

<<Предыдущий урок   Список уроков   Следующий урок>>

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

Наследование в Java позволяет повторно использовать код одного класса в другом классе, то есть вы можете унаследовать новый класс от уже существующего класса. Главный наследуемый класс в Java называют родительским классам, или суперклассом. Наследующий класс называют дочерним классом, или подклассом. Подкласс наследует все поля и свойства суперкласса, а также может иметь свои поля и свойства, отсутствующие в классе-родителе.

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

Рассмотрим класс под названием Shape (Форма). Shape является базовым классом, от которого наследуются другие формы, таких как прямоугольник, квадрат, круг и т.д.

 

public class Shape {
    public double area ()
    {
        return 0;   
    }
}

 

Поскольку это просто общая «форма», метод  вычисления площади area() будет возвращать ноль.
Чтобы узнать площадь конкретной фигуры, нужно создать подкласс, унаследованный от класса Shape, и в нем переопределить метод area().

От класса Shape  наследуется класс Circle, который тоже представляет собой форму.

 

class Circle extends Shape {  // ключевое слово "extends" означает наследование

    private static final double PI = Math.PI;   // константа
    private double diameter; //любое число, представляющее диаметр этого круга

    public Circle(double diameter) { // конструктор
        this.diameter = diameter;
    } 

    public double area(){
        double radius = diameter / 2.0;
        return PI * radius * radius;
    }
}

 

Метод area() базового класса наследуется классом Circle и становится доступен в нем, но нам нужно  переопределить метод area() в классе Circle, таким образом, чтобы он вычислял площадь круга.

Преимущество использования наследования в том, что вы можете написать код, который можно применить к ряду классов, расширяющих более общий класс.

Создадим  класс Main, и в нем напишем метод, который вычисляет большую площадь двух фигур:

 

public class Main {
    public static void main(String[] args) {
        Shape s1 = new Circle (5.0);
        Shape s2 = new Rectangle (5.0, 4.0);
        Shape larger = getLargerShape(s1,s2);

        System.out.println("The area of the larger shape is: "+larger.area());
    }

    public static Shape getLargerShape(Shape s1, Shape s2) {
        if(s1.area() > s2.area())
            return s1;
        else
            return s2;
    }
}

 

Как вы можете видеть, метод getLargerShape() не требует указания определенного типа фигуры для его двух параметров. В качестве параметров для этого метода можно использовать экземпляр любого класса, который наследует тип Shape. Можно использовать экземпляр класса круг, прямоугольник, треугольник, трапеция, и т.д. – до тех пор, как они наследуют класс формы.

Резюме:

Наследование классов ( inheritance ) один из существенных атрибутов ООП (объектно-ориентированного программирования). Оно позволяет строить новые классы на базе существующих, добавляя в них новые возможности или переопределяя существующие.

Унаследованные поля могут быть использованы непосредственно, как и любые другие поля. Вы можете объявить поле в дочернем классе с тем же именем, что и в суперклассе, скрывая его таким образом (но это не рекомендуется). Вы можете объявить новые поля в подклассе, которых нет в суперклассе. Унаследованные методы тоже можно использовать непосредственно. Вы можете написать в подклассе новый метод, который имеет ту же сигнатуру, что и метод суперкласса, это называется переопределением метода. Вы можете написать новый статический метод в подклассе, который имеет ту же сигнатуру, что и метод суперкласса, таким образом, скрывая его (то есть метод суперкласа будет виден внутри подкласса только через ключевое слово super). Вы можете объявить новые методы в подклассе, которых нет в суперклассе. Вы можете написать конструктор подкласса, который вызывает конструктор суперкласса, неявно или с помощью ключевого слова super. Подкласс не наследует закрытые члены родительского класса, например, обозначенные модификатором private.

Упражнение:

Создайте недостающий класс Rectangle, который наследует класс Shape и находит площадь.

Дополнительное чтение:


<<Предыдущий урок   Список уроков   Следующий урок>>

Коментарі: 11
  1. Mopuapmu

    Работаю на Андроид Студиа, запуская с Main. андроид выдает ошибку. кто работает на студиа советую Поменять на такой код.
    Class Shape – дополнить
    public static double getLargerShape(Shape s1, Shape s2){
    if(s1.area()<s2.area()){
    return s2.area();
    }
    else return s1.area();
    }
    Метод будет возвращать double.
    В Main написать это
    Shape s1 = new Circle (5.0);
    Shape s2 = new Rectangle (5.0, 4.0);
    double larger = Shape.getLargerShape(s1,s2);
    System.out.println("Площадь"+larger);

  2. tester

    public class Shape {
    public static void shape()
    {
    double ab = 3.0;
    double bc = 7.0;
    double s = ab*bc;
    System.out.println(“Площадь прямоугольника: “+s);
    }
    }

    class Rectangle extends Shape {
    public static void aria(){
    Shape.shape();
    }
    }

    public class Main
    {
    public static void main(String[] args) {
    Rectangle.aria();
    }
    }

  3. Все получилось. Вопрос на понимание у меня: когда мы пишем в классе Main:
    public static Shape getLargerShape(Shape s1, Shape s2) {
    if (s1.area()> s2.area())
    return s1;
    else
    return s2;
    }
    мы объявляем этот метод в классе Shape или мы словом “Shape” инициализируем класс чтобы можно было к нему обратиться и запросить значения s1 и s2?

    1. Papashkin

      Инициализация метода класса писалась бы через точку, то есть ..

  4. al

    картинки поправьте

    1. admin (автор)

      спасибо, сделано

  5. Serge

    //Rectangle.java

    public class Rectangle extends Shape {

    private double lenght;
    private double width;

    public Rectangle(double lenght, double width) {
    this.lenght = lenght;
    this.width = width;
    }

    public double area() {
    return lenght * width;
    }
    }

  6. Vsdim

    public class Rectangle extends Shape{
    public double SideA;
    public double SideB;

    public Rectangle(Double SideA, Double SideB){
    this.SideA = SideA;
    this.SideB = SideB;
    }

    public double Area(){
    return SideA * SideB;
    }
    }

Додати коментар