Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 12
  • 84

Załóżmy, że:

- Class1 extends Class2

- Class1 posiada metodę getSomeSting(Long id);

 

Jak sprawić, żeby podczas tworzenia nowego obiektu Class2 wykorzystywana była implementacja metody

etSomeSting(Long id) z Class2, a nie odziedziczona z Class1?

Mateusz_Raszyk
  • Zapytał
  • @ Mateusz_Raszyk | 21.02.2015
    • laureat
    • 10
    • 1
    • 7

Odpowiedzi (2)

  • 0

Uściślijmy:

Class1 - klasa nadrzędna,

Class2 - klasa potomna, dziedzicząca po Class1 (Class2 extends Class1 - myślę, że o to Ci chodziło).

Aby wywołać metodę getSomeSting(Long id) zdefiniowaną w Class2, trzeba ją przysłonić (override). Poniżej przykład takiego kodu:

 

class Class1 {
	void getSomeSting(Long id) {
		System.out.println("Class1");
	}
}

class Class2 extends Class1 {
	@Override
	void getSomeSting(Long id) {
		System.out.println("Class2");
	}
}

public class ClassExample {

	public static void main(String[] args) {
		Class1 c1 = new Class2();
		Long l1 = new Long(1);
		c1.getSomeSting(l1);
	}
}

 

Wynikiem działania programu jest "Class2", pomimo użycia referencji typu Class1 - użycie polimorfizmu. Słowo @Override informuje kompilator, że zamierzamy przysłonić metodę i dokonuje on dodatkowego sprawdzenia, czy metoda przysłaniana faktycznie istnieje i ma poprawne parametry - pozwala to uniknąć literówek i błędów. Jeśli wszystko jest prawidłowo, bez @Override program zachowa się tak samo.

Maciej_Krauze
  • Odpowiedział
  • @ Maciej_Krauze | 21.02.2015
    • lider
    • laureat
    • 45
    • 16
    • 58
  • 0

W uzupełnieniu do poprzedniej odpowiedzi:

Jeśli mamy łańcuch dziedziczących po sobie klas, to polimorfizm oznacza możliwość odniesienia się do obiektu potomnego poprzez typ referencji któregoś z typów bazowych (typu przodka lub interfejsu, który implementuje klasa).

Z przesłonięciem (przedefiniowaniem) metody mamy do czynienia, gdy w typie bazowym oraz potomnym znajdują się metody o identycznych sygnaturach (od Javy SE 5 metody mogą różnić się zwracanym typem, tzn. metoda przesłaniająca może zwracać typ bardziej szczegółowy/potomny w stosunku do typu zwracanego przez metodę przesłanianą).

Zachowanie polimorficzne metod powoduje,  że wywołanie metody przedefiniowanej na referencji bazowej spowoduje wywołanie tejże metody z klasy potomnej (o ile referencja wskazuje ten typ).

Tak więc:

  • typ referencji określa zbiór dostępnych metod, jakie możemy wywołać
  • o tym, która z przesłoniętych metod zostanie wywołana, decyduje typ obiektu, do którego prowadzi referencja (jaki obiekt faktycznie ona wskazuje)
  • Odpowiedział
  • @ | 23.02.2015
  • TRENER MODERATOR ALTKOM AKADEMII