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

  • Наследование — это организационный механизм, который позволяет создавать иерархическую классификацию.
  • Используя наследование, мы можем создать новый класс, являющийся специализацией существующего класса.
  • В терминологии Java наследуемый класс называется суперклассом. Класс, выполняющий наследование, называется подклассом.
  • Следовательно, подкласс — это специализированная версия суперкласса.

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

Зачем нам нужно использовать наследование в JAVA?

Для переопределения метода (поэтому может быть достигнут полиморфизм времени выполнения).

Для кода Повторное использование.

Используемое ключевое слово: расширяет

Синтаксис:

Имя подкласса класса расширяет имя суперкласса{

// тело класса

}

Типы наследования в Java

Дерево наследования:
Java поддерживает только одиночное наследование. Это означает, что класс может расширять только один другой класс. Поэтому в java отношения наследования определяют дерево наследования.

1.Единственное наследство

Когда один класс наследуется от другого одного класса, это называется одиночным наследованием. Пример:

package ExampleInheritance;
class Animal{
    void eat(){System.out.println("eating...");}
}
class Dog extends Animal{
    void bark(){System.out.println("barking...");}
}
class TestInheritance{
    public static void main(String args[]){
        Dog d=new Dog();
        d.bark();
        d.eat();
    }}

Выход:

barking...
eating...

2. Многоуровневое наследование

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

package ExampleInheritance;
class Animal{
    void eat(){System.out.println("eating...");}
}
class Dog extends Animal{
    void bark(){System.out.println("barking...");}
}
class BabyDog extends Dog{
    void weep(){System.out.println("weeping...");}
}
class TestInheritance2{
    public static void main(String args[]){
        BabyDog d=new BabyDog();
        d.weep();
        d.bark();
        d.eat();
    }}

Выход:

weeping...
barking...
eating...

3. Иерархическое наследование

Когда два или более классов наследуют один класс, это называется иерархическим наследованием. Пример:

package ExampleInheritance;
class Animal{
    void eat(){System.out.println("eating...");}
}
class Dog extends Animal{
    void bark(){System.out.println("barking...");}
}
class Cat extends Animal{
    void meow(){System.out.println("meowing...");}
}
class TestInheritance3{
    public static void main(String args[]){
        Cat c=new Cat();
        c.meow();
        c.eat();
    }}

Выход:

meowing...
eating...

4. Множественное наследование

Когда один класс наследуется от нескольких классов, это называется множественным наследованием. Пример: класс C наследуется от класса A и класса B.

Java не допускает множественного наследования, чтобы избежать вызываемой им двусмысленности.

5. Гибридное наследование

Гибридное наследование в Java — это комбинация двух или более типов наследования. Пример: класс D наследуется от класса C и класса B, а классы B и C наследуются от класса A.

Java также не поддерживает гибридное наследование.

Полиморфизм

  • Полиморфизм относится к тому факту, что что-то существует в нескольких формах.
  • Проще говоря, полиморфизм — это способность сообщения отображаться в нескольких форматах.
  • Полиморфизм позволяет нам выполнять одно и то же действие разными способами. Другими словами, полиморфизм позволяет определить один интерфейс и иметь несколько реализаций.
  • Слово «поли» означает «множество», а «морфы» — формы, поэтому оно означает множество форм.

Типы полиморфизма

1. Полиморфизм времени компиляции

2. Полиморфизм во время выполнения

1. Полиморфизм времени компиляции

Полиморфизм времени компиляции назван в честь того, что он возникает в процессе компиляции. Компилятор проверяет сигнатуру метода во время сборки, чтобы определить, какой метод вызывать для данного вызова метода во время сборки. Он также известен как раннее связывание, статический полиморфизм или перегрузка.

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

Теперь давайте посмотрим на пример полиморфизма времени компиляции.

Пример

class SimpleMultiplication
{
    /* Two different functions with same name */
    int multiply(int a, int b)
    {
        return a*b;
    }
    int  multiply(int a, int b, int c)
    {
        return a*b*c;
    }
}
class Demo
{
    public static void main(String args[])
    {
        SimpleMultiplication num = new SimpleMultiplication();
        /* Calling functions */
        System.out.println(num.multiply(10, 20));
        System.out.println(num.multiply(10, 20, 30));
    }
}

Выход

200
6000

Объяснение:

Несмотря на то, что две функции имеют одно и то же имя, т. е. «умножение», они выполняют разные операции, что доказывает смысл полиморфизма, который представляет собой одно и то же имя и разные функции.

2. Полиморфизм во время выполнения

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

Теперь давайте посмотрим на пример полиморфизма во время выполнения.

Пример

class ABC{
    public void myMethod(){
        System.out.println("Overridden Method");
    }
}
public class XYZ extends ABC{
    public void myMethod(){
        System.out.println("Overriding Method");
    }
    public static void main(String args[]){
        ABC obj = new XYZ();
        obj.myMethod();
    }
}

Выход

Overriding Method

Объяснение

В этом примере у нас есть два класса: ABC и XYZ. Родительский класс — это ABC, а дочерний класс — это XYZ. Функция родительского класса myMethod() переопределяется дочерним классом. В этом примере у нас есть объект дочернего класса, выделенный для ссылки на родительский класс. Таким образом, тип объекта будет идентифицирован во время выполнения, чтобы определить, какой метод будет вызываться. Версия вызываемого метода определяется типом объекта (а не типом ссылки).

Теперь, изучив оба понятия, мы теперь можем различать эти два как,

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

Оставьте комментарий и поделитесь своими мыслями.