Klasa abstrakcyjna - dlaczego to działa?

0

Jest sobie przykładowa prosta klasa abstrakcyjna:


 public abstract class MojaKlasa
 {
   private int mnoznik;
   private int wynik;
   
   public MojaKlasa(int mnoznik)
   {
     this.mnoznik = mnoznik;
   }

   public void pomnoz(int liczba)
   {
     wynik = liczba * mnoznik;
     onCalculate();
   }
   
   public int getWynik()
   {
     return wynik; 
   }
 
   protected abstract void onCalculate();
 }

to gdy w IntelliJ wpiszę:

MojaKlasa mojaKlasa = new MojaKlasa

to po klepnięciu Entera IntelliJ automatycznie wygeneruje szablon z metodą "onCalculate", wystarczy tylko uzupełnić parametr konstruktora i metodę "onCalculate":

 MojaKlasa mojaKlasa = new MojaKlasa(10)
 {
   @Override
   protected void onCalculate()
   {
     System.out.println("Wynik: " + this.getWynik()); 
   }
 };
 mojaKlasa.pomnoz(2); 

Wywołanie metody "pomnoz" powoduje wypisanie w konsoli oczekiwanego tekstu "Wynik: 20".
No więc to działa (w Java 13), ale dlaczego daje się w ten sposób użyć (utworzyć instancję) klasy abstrakcyjnej, czyli z operatorem "new"?

9

Tworzysz anonimową klasę rozszerzająca twoja klasę abstrakcyjna, tak samo możesz zrobic z interfejsem.
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

6
benzwreck napisał(a):

Tworzysz anonimową klasę rozszerzająca twoja klasę abstrakcyjna, tak samo możesz zrobic z interfejsem.

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

Dodam tylko że można sobie wypisać klasę System.out.println(mojaKlasa.getClass()) i wtedy zobaczysz że to nie jest MojaKlasa. Można też sprawdzić w Debugerze

1

Dziękuję bardzo Panowie za wyjaśnienie i linka.😊

1 użytkowników online, w tym zalogowanych: 0, gości: 1