<<Предыдущий урок Список уроков Следующий урок>>
Наследование в 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.
Работаю на Андроид Студиа, запуская с 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);
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();
}
}
Все получилось. Вопрос на понимание у меня: когда мы пишем в классе Main:
public static Shape getLargerShape(Shape s1, Shape s2) {
if (s1.area()> s2.area())
return s1;
else
return s2;
}
мы объявляем этот метод в классе Shape или мы словом “Shape” инициализируем класс чтобы можно было к нему обратиться и запросить значения s1 и s2?
Инициализация метода класса писалась бы через точку, то есть ..
картинки поправьте
спасибо, сделано
//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;
}
}
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;
}
}