Arv och polymorphism
Uppgift:
Givet följande klasser:
public class C {
public void f() { h(); }
public void g() { System.out.println("C.g"); }
public void h() { System.out.println("C.h"); }
}
public class B extends C {public void f(int x) { g(); }
public void g() { System.out.println("B.g"); }
public void h(int x) { System.out.println("B.h"); }
}
public class A extends B {public void f(char x) { System.out.println("A.f"); }
public void g() { System.out.println("A.g"); }
public void h() { System.out.println("A.h"); }
}
Vad skrivs ut om följande exekveras?B a = new A();
a.f(42);
C b = new B();
b.f();
a. Först B.g, sen C.hb. Först A.g, sen C.h
c. Först A.g, sen B.h
d. Först B.g, sen A.h
Uppgiften är från en gammal tenta och det saknas svar på den så jag vänder mig till er för att dela med mig av mina tankar och kanske få lite feedback om det är något som jag har fått om bakfoten. Jag antar att uppgiften syfte är att testa ens kunskaper inom arv och polymorphism.
Mina tankar:
B a = new A();
Referensvariabeln a av typen B pekar på ett objekt av typen A
a.f(42);
a "försöker" anropa f i klass A, men eftersom att A ej har skrivit över denna metod så kommer anrop av f i superklassen till A (klass B) att anropas istället? Metod f anropar i sin tur metod g i klass A eftersom att A har skrivit över metoden den ärver av B, och vi får således utskriften A.g
C b = new B();
Referensvariabeln b av typen C pekar på ett objekt av typen B
b.f();
b "försöker" anropar f i klass B, men eftersom att B ej har skrivit över denna metod så kommer anrop av metoden f i superklassen till B (klass C) att anropas istället? Metod f anropar i sin tur metod g i klass C eftersom att B inte har skrivit över metoden den ärver av C, och vi får således utskriften C.h
Jag har provkört koden och påstående b är rätt svar.
Jag tycker det ser ut som du förstått hur det funkar mycket bra, gäller bara att hålla tungan rätt i munnen och gå igenom det metodiskt som du gjort