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

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

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

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

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

[pastacode lang=»java» message=»Shape.java» highlight=»» provider=»manual»]

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

[/pastacode]

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

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

[pastacode lang=»java» message=»Circle.java» highlight=»» provider=»manual»]

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;
    }
}

[/pastacode]

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

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

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

[pastacode lang=»java» message=»Main.java» highlight=»» provider=»manual»]

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;
    }
}

[/pastacode]

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

Резюме:

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

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

Упражнение:

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

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

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


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


admin

Обучающие видео-уроки по разработке приложений для операционной системы Android. Мы поможем любому новичку стать продвинутым разработчиком андроид-приложений!

9 комментариев

Vsdim · 14.03.2016 в 01:26

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;
}
}

Serge · 13.06.2016 в 20:58

//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;
}
}

al · 23.07.2016 в 20:13

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

    admin · 23.07.2016 в 21:05

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

Владимир Гусев · 19.03.2017 в 21:28

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

    Papashkin · 16.11.2017 в 17:11

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

Урок 10. Основы JAVA. Исключения (Exception) и методы их обработки. Операторы try…catch | fanDROID.info · 04.05.2016 в 23:36

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

#8. Компиляция и выполнение java программы с командной строки — Fandroid.info · 15.03.2019 в 10:36

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

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.