Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Java Klassen, Subklassen Compilier-/Laufzeitfehler » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Java Klassen, Subklassen Compilier-/Laufzeitfehler
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
mantrix
unregistriert
Java Klassen, Subklassen Compilier-/Laufzeitfehler Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Gegeben sind eine Klasse A und ihre Subklasse B.

code:
1:
2:
class A {}
class B extends A {}


Geben Sie für folgende Zuweisungen an, ob diese zu einem Kompilierfehler, Laufzeitfehler (in Form einer Exception) oder zu keinem Fehler führen.

code:
1:
2:
3:
4:
5:
6:
A test1 = (B)new A();
A test2 = (A)new B();
B test3 = (A)new B();
B test4 = (B)new A();
A test5 = (B)new B();
B test6 = (A)new A();


Meine Ideen:
Ich verstehe noch nicht ganz, wann es zu Kompilierfehlern und wann zu Laufzeitfehlern kommt.
Ich denke, dass es bei 3 und 6 zu Kompilierfehlern kommt, weil A nicht zu B konvertiert werden kann.

Bei 2 sollte es zu keinem Fehler kommen, weil B ja Subtyp von A ist, aber wie sieht es bei 5 aus? (ist 5 das gleiche weil im Endeffekt doch zu A gecastet wird?)

Bei 1 und 4 bin ich aufgeschmissen..

MfG
10.08.2017 21:26
as_string as_string ist männlich
Routinier


Dabei seit: 06.11.2013
Beiträge: 400
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Warum nicht einfach erstmal ausprobieren.
Ergebnis: 3 und 6 führen zu einem Compiler-Fehler, weil in beiden Fällen implizit von einer allgemeineren auf eine speziellere Klasse gecastet wird bei der Zuweisung.
1 und 4 führen zu einem Laufzeitfehler. Da steht zur Compilezeit streng genommen noch nicht fest, dass bei dem expliziten Cast, der im Code steht, rechts davon eine allgemeinere Klasse steht. Zur Laufzeit dann aber schon, so dass es erst dann einen Fehler gibt.

Allgemein: Ich darf ein Objekt, das "in echt" eine allgemeinere Klasse ist niemals auf eine speziellere casten. Allerdings, wenn ich eine Variable oder den Rückgabewert einer Methode oder so habe, die eigentlich per Deklaration einen allgemeineren Typ zurückgibt, kann es ja sein, dass sie zur Laufzeit trotzdem auch mal speziellere Objekte generiert (oder eine Variable hält), so dass der Cast funktionieren kann. In solchen Fällen sollte man dann aber immer vorher testen (also zur Laufzeit, im Code), ob es in Wirklichkeit tatsächlich der speziellere Typ ist, bevor man den Cast macht, um eben solche Laufzeitfehler zu vermeiden.
In Zeile 1 und 4 macht das new A() jeweils ein neues Objekt vom Typ A. Zur Compilezeit ist nicht sicher klar, dass es nicht auch ein spezielleres sein könnte, weshalb dort der Cast zu B ersteinmal zugelassen wird (wobei es glaub ich Tools gibt, die in einem solchen Fall auch schon zumindest warnen würden, aber der Java Compiler untersucht das nicht weiter, weshalb er es einfach compiliert).

Die Fälle 2 und 5 casten immer nur von einem spezielleren zu einen allgemeineren Typ. Egal ob zur Compile- oder Laufzeit ist das immer ok, weshalb es auch problemlos compiliert und ausgeführt wird.

Gruß
Marco
11.08.2017 10:20 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Java Klassen, Subklassen Compilier-/Laufzeitfehler