ПУТЕШЕСТВИЕ ПО РАЗРАБОТКЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Ничего страшного, если вы не знаете полиморфизм Java?

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

Введение

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

Слово «полиморфизм» состоит из двух греческих слов, то есть «поли» и «морфы», что означает «много» и «формы» соответственно.

В Java есть два типа полиморфизма.

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

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

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

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

Он также известен как статический полиморфизм.

Перегрузка метода:

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

Это повышает читабельность программы.

Предположим, вам нужно выполнить сложение заданных чисел, но может быть любое количество аргументов, если вы напишете метод, такой как a(int,int) для двух параметров, и b(int,int,int) для трех параметров, тогда он Вам, как и другим программистам, может быть сложно понять поведение метода, потому что его имя отличается.

Итак, мы выполняем перегрузку методов, чтобы быстро разобраться в программе.

Мы можем перегрузить метод следующими способами

  1. Путем изменения количества аргументов
  2. Изменив тип данных

Пример 1: перегрузка метода путем изменения количества аргументов.

class Adder{
static int add(int a,int b){return a+b;}
static int add(int a,int b,int c){return a+b+c;}
}

class TestOverloading1{
public static void main(String[] args){
System.out.println(Adder.add(11,11));
System.out.println(Adder.add(11,11,11));
} }

Вывод:

22
33

Пример 2: Перегрузка метода путем изменения типа данных.

class Adder{
static int add(int a, int b){return a+b;}
static double add(double a, double b){return a+b;}
}

class TestOverloading2{
public static void main(String[] args){
System.out.println(Adder.add(11,11));
System.out.println(Adder.add(12.3,12.6));
} }

Вывод:

22
24.9

Примечание. Что следует помнить при перегрузке:

  • Мы не можем изменить возвращаемый тип метода, так как это вызовет двусмысленность.
  • Мы также можем перегрузить основной метод и иметь любое количество основных методов в классе. Но JVM вызывает метод main(), который получает строковые массивы только в качестве аргументов.

Пример:

class TestOverloading4{
public static void main(String[] args){System.out.println("main with String[]");}
public static void main(String args){System.out.println("main with String");}
public static void main(){System.out.println("main without args");}
}

Вывод:

main with String[]

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

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

В этом процессе переопределенный метод вызывается через ссылочную переменную суперкласса. Определение вызываемого метода основано на объекте, на который ссылается ссылочная переменная.

Повышение приведения происходит, если ссылочная переменная родительского класса ссылается на объект дочернего класса.

Пример:

class Bike{
void run(){System.out.println("running");}
}
class Splendour extends Bike{
void run(){System.out.println("running safely with 60km");}
public static void main(String args[]){
Bike b = new Splendor();//upcasting
b.run();
}
}

Вывод:

running safely with 60km.

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

Если подкласс имеет тот же метод, что и объявленный в родительском классе, в Java это называется переопределением метода. Переопределение метода используется для полиморфизма во время выполнения.

Правила переопределения методов Java

  1. Метод должен иметь то же имя, что и в родительском классе.
  2. Метод должен иметь тот же параметр, что и в родительском классе.
  3. Должно быть отношение IS-A (наследование)

Пример:

class Vehicle{
//defining a method
void run(){System.out.println("Vehicle is running");}
}
//Creating a child class
class Bike extends Vehicle{
//defining the same method as in the parent class
void run(){System.out.println("Bike is running safely");}
public static void main(String args[]){
Bike obj = new Bike();//creating object
obj.run();//calling method
}
}

Вывод:

Bike is running safely

Полиморфизм среды выполнения с использованием элементов данных

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

Пример:

class Bike{
int speedlimit=90;
}
Class bike1 extends Bike{
int speedlimit=150;
public static void main(String args[]){
Bike obj=new bike1();
System.out.println(obj.speedlimit);//90
}

Вывод:

90

Полиморфизм времени выполнения Java с многоуровневым наследованием

Пример:

class Animal{
void eat(){System.out.println("eating");}
}
class Dog extends Animal{
void eat(){System.out.println("eating fruits");}
}
class labrador extends Dog{
void eat(){System.out.println("drinking milk");}
public static void main(String args[]){
Animal a1,a2,a3;
a1=new Animal();
a2=new Dog();
a3=new labrador();
a1.eat();
a2.eat();
a3.eat();
}
}

Вывод:

eating
eating fruits
drinking Milk

Код Java с полиморфизмом или без него:

Без полиморфизма

class Rectangle{
int length;
int width;
void insert(int l, int w){
length=l;
width=w;
}
void calculateArea(){System.out.println(length*width);}
}
class TestRectangle1{
public static void main(String args[]){
Rectangle r1=new Rectangle();
Rectangle r2=new Rectangle();
r1.insert(11,5);
r2.insert(3,15);
r1.calculateArea();
r2.calculateArea();
}
}

Вывод:

55
45

С полиморфизмом

class Rectangle {
// Overloaded Area() function to
// calculate the area of the rectangle
// It takes two double parameters
void Area(double S, double T)
{
System.out.println("Area of the rectangle: "
+ S * T);
}
// Overloaded Area() function to
// calculate the area of the rectangle.
// It takes two float parameters
void Area(int S, int T)
{
System.out.println("Area of the rectangle: "
+ S * T);
}
}
class ABC{
// Driver code
public static void main(String[] args)
{
// Creating object of Rectangle class
Rectangle obj = new Rectangle();
// Calling function
obj.Area(20, 10);
obj.Area(10.5, 5.5);
}
}

Вывод:

Area of the rectangle: 200
Area of the rectangle: 57.75

Временная сложность: O(1)

Преимущества полиморфизма

  • Это помогает программистам повторно использовать код и классы, когда-то написанные, протестированные и реализованные. Их можно повторно использовать разными способами.
  • Одиночные имена переменных могут использоваться для хранения переменных нескольких типов данных (Float, Double, Long, Int и т. д.).
  • Полиморфизм помогает уменьшить связь между различными функциями.

Недостаток полиморфизма

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

Заключение

Наконец, я хотел бы поблагодарить читателей за чтение моей статьи. Я надеюсь, что это помогло вам расширить ваши знания о полиморфизме. Спасибо за прочтение!