Когда класс расширяет другой класс, это называется наследованием. Расширяемый класс называется подклассом, а расширенный класс называется суперклассом. Любой класс в 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 имеет статический метод printStatic
printStatic
Это случай сокрытия метода .
Пример:
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 прямо или косвенно.
- Ссылка на суперкласс может ссылаться на объект подкласса.
- Если ссылка является суперклассом, а объект относится к подклассу, то вызов метода экземпляра для него приведет к выполнению метода, определенного в подклассе.
- Переопределенный метод имеет ту же сигнатуру и возвращаемый тип (или совместим с возвращаемым типом), что и метод суперкласса.
- Мы можем скрыть статический метод, определенный в суперклассе, определив статический метод, имеющий ту же сигнатуру или тип возвращаемого значения (или совместимый с типом возвращаемого значения), что и метод суперкласса.
- При запуске конструктора подкласса также запускается конструктор суперкласса. Это называется цепочкой конструктора.