Рубрики

Использование final с Inheritance в Java

Обязательное условиеПереопределение в Java , Наследование
final — это ключевое слово в Java, используемое для ограничения некоторых функций. Мы можем объявить переменные, методы и классы с ключевым словом final.

Использование final с наследованием

Во время наследования мы должны объявить методы с ключевым словом final, для которого нам необходимо следовать одинаковой реализации во всех производных классах. Обратите внимание, что необязательно объявлять конечные методы на начальном этапе наследования (базовый класс всегда). Мы можем объявить метод final в любом подклассе, для которого мы хотим, чтобы, если любой другой класс расширял этот подкласс, он должен следовать той же реализации метода, что и в этом подклассе.

// Java-программа для иллюстрации
// использование финала с наследованием

  
// базовый класс

abstract class Shape

{

    private double width;

      

    private double height;

      

    // Параметризованный конструктор класса Shape

    public Shape(double width, double height)

    {

        this.width = width;

        this.height = height;

    }

      

    // метод getWidth объявлен как final

    // так что любой класс расширяется

    // Shape не может переопределить его

    public final double getWidth()

    {

        return width;

    }

      

    // метод getHeight объявлен как final

    // любой класс, расширяющий Shape

    // не могу переопределить

    public final double getHeight() 

    {

        return height;

    }

  

  

    // метод getArea () объявлен как абстрактный

    // это на его подклассы, чтобы обеспечить

    // полная реализация

    abstract double getArea();

}

  
// производный класс один

class Rectangle extends Shape

{

    // Параметризованный конструктор класса Rectangle

    public Rectangle(double width, double height)

    {

        // вызов конструктора класса Shape

        super(width, height);

    }

  

    // метод getArea переопределяется и объявляется

    // как финал, так что любой класс расширяется

    // Прямоугольник не может переопределить его

    @Override

    final double getArea() 

    {

        return this.getHeight() * this.getWidth();

    }

      
}

  
// производный класс два

class Square extends Shape

{

    // Параметризованный конструктор квадратного класса

    public Square(double side)

    {

        // вызов конструктора класса Shape

        super(side, side);

    }

  

    // метод getArea переопределяется и объявляется как

    // финал, поэтому любой класс расширяется

    // Квадрат не может переопределить это

    @Override

    final double getArea() 

    {

        return this.getHeight() * this.getWidth();

    }

      
}

  
// Класс водителя

public class Test

{

    public static void main(String[] args)

    {

        // создаем объект Rectangle

        Shape s1 = new Rectangle(10, 20);

          

        // создание объекта Square

        Shape s2 = new Square(10);

          

        // получаем ширину и высоту s1

        System.out.println("width of s1 : "+ s1.getWidth());

        System.out.println("height of s1 : "+ s1.getHeight());

          

        // получаем ширину и высоту s2

        System.out.println("width of s2 : "+ s2.getWidth());

        System.out.println("height of s2 : "+ s2.getHeight());

          

        // получение области s1

        System.out.println("area of s1 : "+ s1.getArea());

          

        // получение области s2

        System.out.println("area of s2 : "+ s2.getArea());

          

    }

}

Выход:

width of s1 : 10.0
height of s1 : 20.0
width of s2 : 10.0
height of s2 : 10.0
area of s1 : 200.0
area of s2 : 100.0

Использование final для предотвращения наследования

Когда класс объявлен как final, он не может быть разделен на подклассы, то есть никакой другой класс не может расширить его. Это особенно полезно, например, при создании неизменяемого класса, такого как предопределенный класс String . Следующий фрагмент иллюстрирует заключительное ключевое слово с классом:

final class A
{
     // methods and fields
}
// The following class is illegal.
class B extends A 
{ 
    // ERROR! Can't subclass A
}

Замечания :

  • Объявление класса как final неявно объявляет все его методы как final.
  • Недопустимо объявлять класс как абстрактный и конечный, поскольку абстрактный класс сам по себе неполон и полагается на свои подклассы для обеспечения полной реализации. Для больше на абстрактных классах, обратитесь к абстрактным классам в Java

Использование final для предотвращения переопределения

Когда метод объявлен как final, он не может быть переопределен подклассами. Класс Object делает это — ряд его методов является final. Следующий фрагмент иллюстрирует заключительное ключевое слово с методом:

class A 
{
    final void m1() 
    {
        System.out.println("This is a final method.");
    }
}

class B extends A 
{
    void m1()
    { 
        // ERROR! Can't override.
        System.out.println("Illegal!");
    }
}

Обычно Java разрешает вызовы методов динамически, во время выполнения. Это называется поздним или динамическим связыванием . Однако, поскольку окончательные методы не могут быть переопределены, вызов одного из них может быть разрешен во время компиляции. Это называется ранним или статическим связыванием .

Эта статья предоставлена Гауравом Миглани . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

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

Рекомендуемые посты:

Использование final с Inheritance в Java

0.00 (0%) 0 votes