Vad avgör om kod kompilerar i Java?
Compilatorn kollar statisk typ: metoder & arvshierarki.
Vad avgör vilken metod som körs?
JVM kollar dynamisk typ: vilken implementation objektet faktiskt har (dynamisk bindning).
Kan man skapa en instans av en abstrakt klass eller ett interface?
Nej. new A() där A är abstract/interface → compile error.
Men du kan ha en referens av den typen.
Är uppåt-cast (subklass → superklass) alltid giltig?
Ja. Kompilerar och körs alltid.
Är nedåt-cast (superklass → subklass) alltid giltig?
Nej. Kompilerar om de är i samma hierarki, men kan ge ClassCastException om objektet inte är rätt typ.
Vad händer om den statiska typen inte har metoden?
Compile error, även om den dynamiska typen har den.
Interface-referens: vilka metoder kan anropas?
Bara de metoder som finns i interfacet.
Overriding vs Overloading
Overriding = samma signatur → dynamisk bindning.
Overloading = olika parametrar → statisk bindning (väljs vid kompilering).
Vanlig tenta-fälla: C c = new A(); där C extends A
Compile error: statisk typ C kan inte peka på A-objekt.
Vanlig tenta-fälla: IA a = new A(); där A är abstract och implementerar IA
Compile error: abstract klass kan inte instansieras.
Vanlig tenta-fälla: B b = (B) new A();
Compile OK, men runtime crash: ClassCastException.
Vanlig tenta-fälla: IX x = new C(); A a = x;
Compile error: IX och A är inte kompatibla.