OOP | Dla początkujących | Dynamiczny vs. Statyczny
Cztery podstawowe pojęcia OOP (Object Oriented Programming) to Dziedziczenie, Abstrakcja, Polimorfizm i Enkapsulacja. Dla kogoś, kto jest nowy w OOP, może być trochę trudno na początku uchwycić ostatnie 3 z podstawowych pojęć OOP (ponieważ dziedziczenie jest trochę łatwiejsze do zrozumienia).
Polimorfizm jest zdolnością obiektu do przyjmowania wielu form.
Każdy obiekt Java, który może przejść więcej niż jeden test IS-A jest uważany za polimorficzny- tutorialspoint. Oznacza to, że każdy obiekt klasy dziecięcej może przyjąć dowolną formę klasy w swojej hierarchii nadrzędnej i oczywiście siebie również. Co to właściwie znaczy, że obiekt klasy dziecięcej może być przypisany do dowolnego odniesienia do klasy w swojej hierarchii nadrzędnej i oczywiście siebie również.
Eg: Powiedzmy, że klasa Student jest dzieckiem klasy Person
Student student = new Student()
Person person = new Student()
Najczęstsze użycie polimorfizmu w OOP występuje, gdy odniesienie do klasy nadrzędnej jest używane do odniesienia do obiektu klasy dziecięcej. Właściwie mówi się tutaj o polimorfizmie dynamicznym (który opiszę w następnej kolejności).
Istnieją 2 rodzaje polimorfizmu, które są powszechnie wymieniane.
- Polimorfizm dynamiczny
- Polimorfizm statyczny
Polimorfizm dynamiczny
Jest on również wymieniany jako polimorfizm w czasie rzeczywistym, wiązanie dynamiczne, wiązanie w czasie rzeczywistym, wiązanie późne i nadpisywanie metod. Tutaj posiadanie wielu form ma miejsce w różnych klasach.
To jest to, co jest powszechnie znane jako tak zwany „polimorfizm”. Pozwól, że wyjaśnię to BARDZO PROSTO –
Załóżmy, że istnieją metody o tej samej sygnaturze w klasach w hierarchii klas (relacje rodzic-dziecko), te metody są w różnych formach (jest to znane jako nadpisywanie metod).
Gdy obiekt jest przypisany do referencji klasy i gdy wywoływana jest metoda obiektu, wykonywana jest metoda w klasie obiektu. Nie metoda klasy referencyjnej (jeśli referencja jest klasą nadrzędną).
Co się tutaj dzieje, ponieważ tworzenie obiektu odbywa się w czasie wykonywania, forma metody, która powinna być wykonana (metoda w obiekcie) może być określona tylko w czasie wykonywania.
Eg: Kod Java
class Person {
public void teach(){
System.out.println("Person can teach");
}
}
class Teacher extends Person {
public void teach() {
System.out.println("Teacher can teach in a school");
}
}
public class TestTeacher {
public static void main(String args) {
Person person = new Person(); //Person reference and object
Person another_person = new Teacher(); //Person reference, Teacher object
Teacher teacher = new Teacher(); //Teacher reference and obj. person.teach();//output: Person can teach // Here you can see Teacher object's method is executed even-
// -though the Person reference was used
another_person.teach();//output: Teacher can teach in a school teacher.teach();//output: Teacher can teach in a school
}
}
Polimorfizm statyczny
Wymieniany jest również jako Compile-Time polymorphism, Statyczne wiązanie, Wiązanie w czasie kompilacji, Wczesne wiązanie i Przeciążanie metod. Tutaj posiadanie wielu form ma miejsce w tej samej klasie.
Jeśli wyjaśnię to PROSTO..
To jest właściwie przeciążanie metod. Przeciążanie metod to posiadanie więcej niż jednej metody o tej samej nazwie, ale z różnymi argumentami (typ powrotu może być taki sam lub nie). Tutaj podczas wywoływania metod kompilator wybiera, którą metodę wywołać w zależności od parametrów przekazanych podczas wywoływania. Dzieje się to w czasie kompilacji.
Eg: Kod Java
class Calculator {
void add(int a, int b) {
System.out.println(a+b);
}
void add(int a, int b, int c) {
System.out.println(a+b+c);
}
}public class Demo {
public static void main(String args) {
Calculator calculator = new Calculator(); // method with 2 parameters is called
calculator.add(10, 20); //output: 30 // method with 3 parameters is called
calculator.add(10, 20, 30); //output: 60
}
}
Niektórzy ludzie mówią, że przeciążanie metod nie jest prawdziwie polimorfizmem. Ale myślę, że można to sklasyfikować jako rodzaj polimorfizmu, ponieważ w przeciążaniu metod istnieje metoda w wielu formach.
Mam nadzieję, że to pomogło w zrozumieniu polimorfizmu po prostu.
Cheeers! 😀
Tutaj jest kilka przydatnych linków
- Nadpisywanie metod
- Przeciążanie metod
- Typy polimorfizmu
- Różnica między polimorfizmem w czasie wykonywania a polimorfizmem w czasie kompilacji