Статьи

Интерфейс и наследование в Java: наследование

Когда класс расширяет другой класс, это называется наследованием. Расширяемый класс называется подклассом, а расширенный класс называется суперклассом. Любой класс в Java, который не расширяет любой другой класс, неявно расширяет класс Object .

Другими словами, каждый класс в Java прямо или косвенно наследует класс Object.

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

Используя наследование, вы можете повторно использовать существующий код. Если у вас уже есть написанный класс (но нет исходного кода) и в нем отсутствуют некоторые функции, вам не нужно писать все с нуля. Просто расширьте класс и добавьте новый метод, который удовлетворяет вашим потребностям.

Примечание :

Частные методы и свойства не наследуются. Однако, если суперкласс имеет закрытую переменную и открытый метод, который использует переменную, тогда переменная становится доступной внутри метода в подклассе. Также следует отметить, что конструкторы никогда не наследуются.

Как продлить

Используйте ключевое слово extends для наследования суперкласса

class A{

//properties and methods of A

}

class B extends A {

}

Примечание. Класс может наследовать только один класс. Множественное наследование не поддерживается в Java.

Переопределение метода и сокрытие

Когда подкласс определяет метод с такой же сигнатурой и типом возврата (или совместимым с типом возврата метода суперкласса), это называется переопределением метода .

Пример:

 class A{

int x;

public void printIt(){

System.out.println(“method in class A”);

}

}

class B extends A{

public void printIt(){

System.out.println(“method in class B”);

}

}

class Test{

public static void main(String[] args){

A a=new B();

a.printIt(); // prints “method in class B” without quotes

}

}

Здесь класс B расширяет класс A и переопределяет метод printIt() Таким образом, когда мы запускаем приведенный выше код, вызываемый метод является printIt()printIt() Тем не менее он может получить доступ к версии метода суперкласса, используя ключевое слово super .

Пример:

 class B extends A{

public void printIt(){

super.printIt();

System.out.println(“method in class B”);

}

}

Замечания:

В предыдущем примере мы использовали ссылку типа A и объекта B. Но чей printIt() Java ждет до времени выполнения программы и проверяет, на какой объект указывает ссылка. В этом случае объект принадлежит к классу B. Итак, это метод printIt() Это называется отправкой динамического метода или вызовом виртуального метода.

Теперь давайте предположим, что класс A имеет статический метод printStaticprintStatic Это случай сокрытия метода .

Пример:

 class A{

public static void printStatic(){

System.out.println("In A");

}}

class B extends A{

public static void printStatic(){

System.out.println("In B");

}

}

class Test{

public static void main(String[] args){

A a=new B();

a.printStatic(); // prints “In A” without quotes

//We can also call like this A.printStatic()

}

}

В этом случае во время компиляции Java будет искать ссылочный тип, а не объект, на который указывает указатель. Здесь ссылочный тип — A. Итак, printStatic()

Кастинг объектов

Давайте рассмотрим пример, где класс A является суперклассом, а класс B является подклассом. Мы уже знаем, что можно создать объект класса B и назначить его для ссылки типа A. Но сделав это, вы сможете вызывать методы, которые определены только в классе A. Чтобы вызвать методы, определенные классом B, вам нужно привести ссылку.

Пример:

 A a=new B();

a.methodSpecificToB(); // illegal

B b=(B)a;

b.methodSpecificToB(); //legal

Конструктор цепочки

Когда мы создаем экземпляр подкласса, также запускается конструктор суперкласса. Это происходит с помощью вызова super() Когда мы явно не вызываем super()super()this()

Если вы не определили конструктор для своего класса, компилятор создает конструктор по умолчанию (который не является аргументом) и помещает вызов super() Единственное условие — у вашего суперкласса не должно быть конструктора arg, иначе он выдаст ошибку времени компиляции. Если у вас есть суперкласс, у которого нет конструктора no arg, вам следует вызвать super()

Концепция будет понятна из следующего примера:

 class A{

A(){

System.out.println(“Constructor of A running”);

}

}

class B extends A{

B(){

//a call to super() is placed here

System.out.println(“Constructor of B running”);

}

}

public class Test{

public static void main(String[] args){

new B();

}

}

Выход

Конструктор бега

Конструктор Б Бег

Примечание. Сначала вызывается конструктор подкласса, но сначала завершается выполнение конструктора суперкласса.

Резюме

  • Класс может расширять только один класс.
  • Каждый класс является подклассом Object прямо или косвенно.
  • Ссылка на суперкласс может ссылаться на объект подкласса.
  • Если ссылка является суперклассом, а объект относится к подклассу, то вызов метода экземпляра для него приведет к выполнению метода, определенного в подклассе.
  • Переопределенный метод имеет ту же сигнатуру и возвращаемый тип (или совместим с возвращаемым типом), что и метод суперкласса.
  • Мы можем скрыть статический метод, определенный в суперклассе, определив статический метод, имеющий ту же сигнатуру или тип возвращаемого значения (или совместимый с типом возвращаемого значения), что и метод суперкласса.
  • При запуске конструктора подкласса также запускается конструктор суперкласса. Это называется цепочкой конструктора.