Polimorfizm i wiązanie dynamiczne w Javie
Źródło: DZone Polimorfizm jest jedną z podstawowych koncepcji programowania obiektowego. Niezależnie od tego, czy dopiero zaczynasz programować w Javie, czy jesteś doświadczonym programistą, powinieneś wiedzieć, czym jest polimorfizm i jak działa. Większość programistów twierdzi, że jest dobrze zorientowana w tym temacie, jednak jeśli chodzi o inne złożone funkcje, takie jak wiązanie statyczne i dynamiczne, wielu z nich traci pewność siebie.Co to jest polimorfizm w Javie?
Polimorfizm oznacza posiadanie wielu form. W programowaniu odnosi się to do zdolności sygnału lub komunikatu do pojawienia się w więcej niż jednej formie.Przykład z życia wzięty
Osoba może wykazywać wiele cech jednocześnie. Na przykład matka może być jednocześnie żoną, córką, siostrą, pracownikiem firmy i tak dalej. Dlatego dana osoba może wykazywać różne cechy w różnych warunkach. Nazywa się to polimorfizmem.Znaczenie polimorfizmu
Polimorfizm jest jedną z najważniejszych cech każdego obiektowego języka programowania (na przykład Java). Za pomocą polimorfizmu to samo zadanie można wykonać na różne sposoby.Rodzaje polimorfizmu
W Javie polimorfizm można podzielić na dwie kategorie:- Polimorfizm w czasie kompilacji (łączenie statyczne)
- Polimorfizm środowiska wykonawczego (środowisko wykonawcze, wiązanie dynamiczne)
Polimorfizm w czasie kompilacji
Polimorfizm w czasie kompilacji jest również znany jako łączenie statyczne. Ten typ polimorfizmu można osiągnąć poprzez przeciążenie funkcji lub przeciążenie operatora. Ale w Javie ogranicza się to do przeciążania funkcji, ponieważ Java nie obsługuje przeciążania operatorów. Przeciążanie funkcji Jeśli istnieją co najmniej dwie funkcje lub metody o tej samej nazwie funkcji, ale liczba zawartych w nich parametrów jest różna lub co najmniej jeden typ danych odpowiedniego parametru jest inny (lub oba), wówczas nazywa się to funkcją lub przeciążanie metod, a funkcje te są znane jako funkcje przeciążone. Przykład 1 Do tej pory badaliśmy, czym jest przeciążenie funkcji. Spróbujmy teraz zademonstrować przeciążenie funkcji oprogramowania.class Main {
// Method 1
// Method with 2 integer parameters
static int Addition(int a, int b)
{
// Returns sum of integer numbers
return a + b;
}
// Method 2
// having the same name but with 2 double parameters
static double Addition(double a, double b)
{
// Returns sum of double numbers
return a + b;
}
public static void main(String args[]) {
// Calling method by passing
// input as in arguments
System.out.println(Addition(12, 14));
System.out.println(Addition(15.2, 16.1));
}
}
Powyższy program możesz uruchomić tutaj . Wyjaśnienie programu:
-
Powyższy program składa się z dwóch funkcji statycznych o tych samych nazwach: Dodawanie .
-
Tutaj obie funkcje zawierają tę samą liczbę parametrów, ale odpowiadające im parametry są różne.
-
Metoda 1 akceptuje dwa parametry całkowite, natomiast Metoda 2 akceptuje dwa parametry podwójne .
-
Z funkcji głównej wywołujemy najpierw funkcję Dodawanie(12, 14) . Przekazywane parametry są liczbami całkowitymi (12 i 14), dlatego w tym miejscu zostanie wywołana Metoda 1 .
-
Następnie wywołaliśmy funkcję Dodawanie(15.2, 16.1) . Ponieważ przekazane parametry mają podwójny typ danych (15.2 i 16.1), tym razem zostanie wywołana Metoda 2 .
-
W ten sposób osiąga się przeciążenie funkcji w Javie w oparciu o różne typy danych parametrów.
class Main {
// Method 1
// Method with 2 integer parameters
static int Addition(int a, int b)
{
// Returns sum of integer numbers
return a + b;
}
// Method 2
// having the same name but with 3 integer parameters
static double Addition(double a, double b)
{
// Returns sum of integer numbers
return a + b;
}
public static void main(String args[]) {
// Calling method by passing
// input as in arguments
System.out.println(Addition(12, 14));
System.out.println(Addition(15.2, 16.1));
}
}
Powyższy program możesz uruchomić tutaj . Wyjaśnienie programu:
-
Powyższy program składa się z dwóch funkcji statycznych o tych samych nazwach: Dodawanie .
-
W tym przypadku obie funkcje zawierają różną liczbę parametrów, ale typ danych dwóch pierwszych odpowiadających im parametrów jest taki sam (liczba całkowita).
-
Metoda 1 przyjmuje dwa parametry typu całkowitego, a metoda 2 trzy parametry typu danych typu całkowitego.
-
Z funkcji głównej wywołujemy najpierw funkcję Dodawanie(2, 3) . Ponieważ przekazane parametry są liczbami całkowitymi (2 i 3), wywołają tutaj Metodę 1 .
-
Następnie wywołaliśmy funkcję Dodawanie(4, 5, 6) . Przekazywane parametry są podwójnymi typami danych (4, 5, 6), więc tym razem wywołają Metodę 2 .
-
W ten sposób funkcje są przeciążane w Javie w oparciu o różną liczbę parametrów.
class Main {
// Method 1
// Method with 2 integer parameters
static int Addition(int a, int b)
{
// Return the sum
return a + b;
}
// Method 2
// having the same name but with 3 parameters
// 1st parameter is of type double and other parameters
// are of type integer
static double Addition(double a, int b, int c)
{
// Return the sum
return a + b + c;
}
public static void main(String args[]) {
// Calling method by passing
// input as in arguments
System.out.println(Addition(2, 4));
System.out.println(Addition(4.2, 6, 10));
}
}
Powyższy program możesz uruchomić tutaj . Wyjaśnienie programu:
-
Powyższy program składa się z dwóch funkcji statycznych o tych samych nazwach: Dodawanie .
-
Obie funkcje zawierają różną liczbę parametrów i typ danych pierwszego odpowiedniego elementu jest również inny.
-
Metoda 1 przyjmuje dwa parametry całkowite, natomiast Metoda 2 trzy parametry — pierwszy jest typu double, a pozostałe dwa są typami danych całkowitych.
-
Z funkcji głównej wywołujemy najpierw funkcję Dodawanie(2, 4) . Ponieważ przekazane parametry są liczbami całkowitymi (2 i 4), wywołają tutaj Metodę 1 .
-
Następnie wywołaliśmy funkcję Dodawanie(4.2, 6, 10) . Pierwszy przekazany parametr jest typu całkowitego, a pozostałe parametry są typu danych double (4.2, 6, 10), więc tym razem zostanie wywołana Metoda 2 .
-
W ten sposób Java osiąga przeciążenie funkcji w oparciu o różną liczbę parametrów, a także różne typy danych odpowiednich parametrów.
Polimorfizm środowiska wykonawczego
Ta opcja jest również nazywana łączeniem dynamicznym. W tym procesie wywoływanie funkcji utworzonej dla innej funkcji jest dozwolone tylko w czasie wykonywania. Możemy osiągnąć dynamiczne wiązanie w Javie za pomocą przesłaniania metod.Zastąpienie metody
Przesłanianie metod w Javie ma miejsce, gdy metoda w klasie bazowej ma definicję w klasie pochodnej. Metoda lub funkcja klasy bazowej nazywana jest metodą przesłoniętą.// Class 1
class Parent {
// Print method
void Print()
{
// Print statement
System.out.println("Inside Parent Class");
}
}
// Class 2
class Child1 extends Parent {
// Print method
void Print() { System.out.println("Inside Child1 Class"); }
}
// Class 3
class Child2 extends Parent {
// Print method
void Print()
{
// Print statement
System.out.println("Inside Child2 Class");
}
}
class Main {
public static void main(String args[]) {
// Creating an object of class Parent
Parent parent = new Parent();
parent.Print();
// Calling print methods
parent = new Child1();
parent.Print();
parent = new Child2();
parent.Print();
}
}
Powyższy program możesz uruchomić tutaj . Wyjaśnienie programu:
-
Powyższy program składa się z trzech klas: Rodzic ( klasa 1 ), Dziecko1 ( klasa 2 ) i Dziecko2 ( klasa 3 ). Klasa 2 i klasa 3 dziedziczą klasę 1 .
-
Rodzic ma metodę o nazwie Print() . Wewnątrz tej funkcji drukujemy „ Wewnątrz klasy nadrzędnej ”. Child1 i Child2 mają także funkcje Print() , które zasadniczo zastępują funkcję Print() klasy Parent i wypisują odpowiednio „ Inside Child1 Class ” i „ Inside Child2 Class ” na konsoli.
-
Z funkcji main tworzymy najpierw obiekt klasy nadrzędnej o nazwie parent. Następnie używamy tego obiektu do wywołania metody print klasy nadrzędnej . Dlatego na konsoli zostanie wydrukowana informacja „ Wewnątrz klasy nadrzędnej ”.
-
Następnie wywołujemy domyślny konstruktor klasy Child1 i wywołujemy funkcję Print() . Należy zauważyć, że metoda Print() zdefiniowana w klasie Child1 zostanie teraz wywołana , ponieważ zastąpiliśmy metodę Print() klasy nadrzędnej . Dlatego na konsoli zostanie wydrukowana informacja „ Inside Child1 Class ”.
-
Na koniec wywołujemy domyślny konstruktor klasy Child2 i wywołujemy funkcję Print() . Tutaj zostanie wywołana metoda Print() zdefiniowana w klasie Child2 , ponieważ nadpisaliśmy metodę Print() klasy nadrzędnej . Dlatego na konsoli zostanie wydrukowana informacja „ Inside Child2 Class ”.
-
W ten sposób w Javie osiąga się nadpisywanie metod.
Wyniki
W tym artykule dowiedzieliśmy się, czym jest polimorfizm w Javie. Następnie zagłębiliśmy się w temat i omówiliśmy dwa typy polimorfizmu w Javie: polimorfizm w czasie kompilacji i polimorfizm w czasie wykonywania. Za pomocą programów pokazaliśmy, jak można osiągnąć statyczne i dynamiczne wiązanie w Javie.Pętla For w Javie + przykład składni pętli forEach
Źródło: FreeCodeCamp Pętla w programowaniu to sekwencja instrukcji, które są wykonywane w sposób ciągły, aż do spełnienia określonego warunku. W tym artykule dowiemy się o pętlach for i forEach w Javie.Dla składni pętli w Javie
Oto składnia tworzenia pętli for :for (initialization; condition; increment/decrement) {
// code to be executed
}
Przyjrzyjmy się niektórym słowom kluczowym w kodzie:
-
for wskazuje, że utworzymy pętlę. Po nim następują nawiasy, które zawierają wszystko, czego potrzebujemy, aby nasza pętla działała.
-
inicjalizacja definiuje zmienną początkową jako punkt początkowy pętli, zwykle liczbę całkowitą.
-
Warunek określa, ile razy pętla powinna zostać wykonana.
-
inkrementacja / dekrementacja zwiększa/zmniejsza wartość zmiennej początkowej przy każdym uruchomieniu pętli. Gdy wartość zmiennej rośnie/maleje, dąży ona do określonego warunku.
-
Należy pamiętać, że każde słowo kluczowe jest oddzielone średnikiem ( ; ).
for(int x = 1; x <=5; x++) {
System.out.println(x);
}
/*
1
2
3
4
5
*/
W powyższym przykładzie zmienną początkową jest x o wartości 1. Pętla będzie działać tak długo, jak wartość x będzie mniejsza lub równa 5 – taki jest warunek. x++ zwiększa wartość x po każdym uruchomieniu. Kontynuowaliśmy drukowanie wartości x , która kończy się po 5, ponieważ warunek został spełniony. Zwiększenie do 6 nie jest możliwe, ponieważ jest większe i nierówne 5. W poniższym przykładzie użyjemy pętli for , aby wydrukować wszystkie wartości z tablicy.
int[] randomNumbers = {2, 5, 4, 7};
for (int i = 0; i < randomNumbers.length; i++) {
System.out.println(randomNumbers[i]);
}
// 2
// 5
// 4
// 7
To prawie to samo, co w ostatnim przykładzie. Tutaj użyliśmy długości tablicy jako warunku, a początkową wartość zmiennej jako zero, ponieważ liczba porządkowa pierwszego elementu tablicy wynosi zero.
Składnia pętli forEach w Javie
Pętla forEach służy specjalnie do iteracji po elementach tablicy. Tak wygląda jego składnia:for (dataType variableName : arrayName) {
// code to be executed
}
Zauważysz, że składnia tutaj jest krótsza niż w przypadku pętli for . Pętla forEach również zaczyna się od słowa kluczowego for . Zamiast inicjować zmienną wartością, najpierw określamy typ danych (musi odpowiadać typowi danych tablicy). Po tym następuje nazwa naszej zmiennej i nazwa tablicy , oddzielone dwukropkiem. Oto przykład, który pomoże Ci lepiej zrozumieć składnię:
int[] randomNumbers = {2, 5, 4, 7};
for (int x : randomNumbers) {
System.out.println(x + 1);
}
/*
3
6
5
8
*/
W tym przykładzie wykonaliśmy iterację po każdym elemencie i zwiększyliśmy jego wartość początkową o 1. Domyślnie pętla zatrzymuje się po przejściu przez wszystkie elementy tablicy. Oznacza to, że nie musimy przekazywać żadnej wartości do naszej zmiennej ani określać żadnego warunku, aby pętla się zakończyła.
GO TO FULL VERSION