sicheres/unsicheres Casten bei Objekten

MOEP_BIBER

Aktives Mitglied
Hey Leute,

hab ne Frage zum Casten von Objekten hier erstmal der Code:

Java:
class Superklasse {
    public final int variable;
    public Superklasse(int variable) {
        this.variable = variable;
    }
}

Java:
class Subklasse extends Superklasse {
    public int variable;
    public Subklasse(int variable) {
        super(5 * variable);
        this.variable = variable;
    }
}

Java:
public class SuperSubApp
{
    public static void main(String[] args)
    {
        Subklasse sub1 = new Subklasse(4);
        Superklasse super2 = sub1;

        System.out.println("sub1.variable " + sub1.variable);
        System.out.println("super2.variable " + super2.variable);
    }
}

So nun zu meiner Frage:

Wieso ist die super2.variable 20? Wird da nur der super-Konstruktor in der Subklasse beim Cast aufgerufen?
Ich hab beim Lesen des Codes gedacht super2.variable ist genau so 4 wie sub1.variable.
Hab allgemein recht wenig zum sicheren bzw unsicheren Casten gefunden wäre nett wenn jemand ne gute Informationsquelle hätte.

MfG Biber
 
Zuletzt bearbeitet:

nrg

Top Contributor
First, you must understand, that by casting you are not actually changing the object itself, you are just labeling it differently.
For example, if you create a Cat and upcast it to Animal, then the object doesn't stop from being a Cat. It's still a Cat, but it's just treated as any other Animal and it's Cat properties are hidden until it's downcasted to a Cat again.

Quelle: Upcasting, downcasting

Aber das ist auch nur bedingt hier passend. Du castest ja nix... Du "labelst" in Zeile 6 nur eine Cat als Animal. Die Attribute sind nach wie vor die von Cat
 

MOEP_BIBER

Aktives Mitglied
Hab mir die seite durchgelesn und eure Posts, aber kapiers noch immer nich ???:L

Könnte mir jemand Schritt für Schritt erklären was passiert?
Debugger bringt mich auch nicht weiter-.-

Steh grad echt aufm schlauch.
 
G

Gonzo17

Gast
Du solltest in der SubKlasse die Zeile
Code:
public int variable;
löschen und in der SuperKlasse das
Code:
final
vor der Variable entfernen. Dann wird auch wirklich in beiden Fällen die gleiche Variable benutzt. In deinem Beispiel sind es zwei unterschiedliche Variablen namens
Code:
variable
.

Edit: Das ist übrigens auch das, was André Uhres wohl meinte. :)
 

nrg

Top Contributor
Object obj = new String("HALLO WELT");

Object ist dein Label. D.h. du hast jetzt ein Stringobjekt, das sich allerdings hinter Object versteckt und somit stehen dir auch nur die Methoden von Object zur Verfügung. Erst mit einem Downcast kannst du die Variable obj anders Labeln und die Attribute und Methoden von String in den Vordergrund holen.

Java:
    	Object obj = new String("HALLO WELT");
    	System.out.println(obj.length()); //Funktioniert nicht! Die length-Methode von String ist verdeckt!!
    	System.out.println(((String)obj).length()); //Funktioniert
    	String s = (String)obj;
    	System.out.println(s.length()); //Funktioniert

Auf dem Link von oben ist das wirklich sehr gut beschrieben.

noch erweiternd: Du erzeugst einmal eine Katze und "deklarierst" diese mit einer einfachen zuweißen als Tier (hier erfolgt ein impliziter upcast). Dadurch bleibt es aber nach wie vor eine Katze und somit ändern sich auch die Attribute nicht. Nochmal zum Quote am Anfang:
First, you must understand, that by casting you are not actually changing the object itself, you are just labeling it differently.

rückwirkend betrachtet bin ich glaub mit meiner Erklärung etwas am Ziel vorbeigeschossen :D. Hatte das beim ersten Überfliegen anders interpretiert ;)
 
Zuletzt bearbeitet:

MOEP_BIBER

Aktives Mitglied
@gonzo: Das ist kein von mir erstelltes Beispiel, sondern eine Aufgabe einer Altklausur. Das heißt also dass muss so sein und is kein von mir geschriebener Fehler oder so.

@nrg: Den Aspekt hab ich in dem Link verstanden nur kapier ich nicht wie mir das bei meiner Aufgabe hilft ???:L

Ich glaub langsam komm ich der Lösung aber näher:

Java:
Superklasse super2 = sub1;
daraus folgt:

Java:
public Subklasse(4) {
        super(5 * 4);
        this.variable = 4;
    }

Dadurch wird die variable in der Superklasse 20 und this.variable = 4 bewirkt nichts, da es sich ja auf die Variable in der Subklasse bezieht, welche super2 gar nicht besitzt oder?
 
G

Gonzo17

Gast
@gonzo: Das ist kein von mir erstelltes Beispiel, sondern eine Aufgabe einer Altklausur. Das heißt also dass muss so sein und is kein von mir geschriebener Fehler oder so.

Ist ja auch kein Fehler ansich, nur dachte ich, dass du es anders machen wolltest und dich vertan hast. ;)

Dadurch wird die variable in der Superklasse 20 und this.variable = 4 bewirkt nichts, da es sich ja auf die Variable in der Subklasse bezieht, welche super2 gar nicht besitzt oder?

In der Klasse SuperKlasse gibt es eine Variable namens
Code:
variable
, die den Wert 20 hat. In der Klasse SubKlasse gibt es eine Variable namens
Code:
variable
, die den Wert 4 hat. Die Variable aus der SuperKlasse ist für die SubKlasse nicht sichtbar, weil sie überschrieben wird (gleicher Name). Castest du dein Objekt zum Typ SuperKlasse, siehst du jedoch lediglich die Methoden und Variablen eben dieser SuperKlasse und da ist in dem Fall die Variable mit dem Wert 20.
 

nrg

Top Contributor
ja. siehe letzten edit oben ;). Aber im Grunde passt das schon auch hier. Du labelst mit dem impliziten Upcast das Objekt anders. Wenn es in der Superklasse garkeine Variable variable gäbe, würde er dir das nicht mal kompilieren. Durch den Upcast werden halt einfach die Attribute von Subklasse verdeckt und die von Superklasse kommen zur Vorschein. Dort wurde aber variable anders intialisiert.

Um kurz und bündig auf den Punkt zu kommen, kann man hier eigentlich nur André Uhres zitieren. Das triffts ganz gut ;).
 

MOEP_BIBER

Aktives Mitglied
Ok danke soweit so gut.
Jedoch wenn ich jetzt den Downcast mache zurück auf die Subklasse, so sollte doch die Variable aus der Subklasse wieder sichtbar werden oder?

also:

Java:
super2 = (Subklasse)super2;
System.out.println("super2.variable " + super2.variable);

Jedoch wird wieder 20 ausgegeben.
Wie könnte ich wenn ich wollen würde auf die variable aus der Subklasse des super2 Objekts zugreifen?
Oder anders rum: Wie könnte ich auf die variable aus der Superklasse des sub1 Objekts zugreifen?

Ps: Das ist nur ein Bruchteil einer Aufgabe die auf 12 Minuten erledigt werden sollte seh ich grad oO
 

nrg

Top Contributor
dein Label von super2 ist doch nach wie vor Superklasse. Wenn dann schon so:

Subklasse wasAuchImmer = (Subklasse)super2;
 

xehpuk

Top Contributor
Achtung: Das sind beides dieselben Objekte, lediglich die Referenzen sind von anderem Typ!

Der Aufruf
Code:
super2 = (Subklasse)super2;
ändert nichts an der Referenz, diese ist noch immer von der Superklasse.

Java:
Subklasse sub2 = (Subklasse) super2;
System.out.println("sub2.variable " + sub2.variable);
 
G

Gonzo17

Gast
Die Variable super2 ist ja trotzdem noch vom Typ SuperKlasse, auch wenn du ihr ein SubKlasse-Objekt zuweist. Wichtig ist was du deklariert hast, was dann "drin ist", ist eigentlich erstmal egal, das ändert die Sichtbarkeit nicht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
L sicheres löschen von Variablen Java Basics - Anfänger-Themen 9
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
B Datentypen Welcher Typ wird beim Casten übernommen? Java Basics - Anfänger-Themen 12
G Probleme beim casten von double zu int Java Basics - Anfänger-Themen 3
BuTTerBroTHDx Char Wert in int casten ? Java Basics - Anfänger-Themen 4
A Vererbung Mit Casten direkt auf Sub-Klasse Zugreiffen Java Basics - Anfänger-Themen 6
N Variablen zurück casten Java Basics - Anfänger-Themen 3
F Casten bei Implements Java Basics - Anfänger-Themen 2
S Klassen casten, IS-A Beziehung Java Basics - Anfänger-Themen 5
J Generics casten Java Basics - Anfänger-Themen 14
U Klassen Dynamisches Casten? Java Basics - Anfänger-Themen 39
T Probleme beim casten Java Basics - Anfänger-Themen 9
M Casten Java Basics - Anfänger-Themen 2
K Collections Vector zu String casten Java Basics - Anfänger-Themen 4
S Polymorphes Objekt in eigentliche Klasse casten Java Basics - Anfänger-Themen 6
masii Methoden Parameter casten? Java Basics - Anfänger-Themen 2
D Datentypen Abstrakter Datentyp lässt sich nicht casten Java Basics - Anfänger-Themen 7
U ArrayList casten Java Basics - Anfänger-Themen 37
F g.drawLine in g 2D casten Java Basics - Anfänger-Themen 5
A Klassen ArrayList richtig / sicher Casten? Java Basics - Anfänger-Themen 3
J Frage zu generischer Klasse und Casten Java Basics - Anfänger-Themen 14
M Frage zum Casten von Objekten Java Basics - Anfänger-Themen 5
D Object auf JTextpane / jTextArea casten? Java Basics - Anfänger-Themen 3
B Casten oder vielleicht was anderes? Java Basics - Anfänger-Themen 9
T Boolean in ein Objektdatentyp casten möglich? Java Basics - Anfänger-Themen 5
J Casten (Typumwandlung) Java Basics - Anfänger-Themen 12
P Casten Hash Map Java Basics - Anfänger-Themen 4
W Auf 'this' casten Java Basics - Anfänger-Themen 3
M Dynamisches Casten mal wieder Java Basics - Anfänger-Themen 4
M casten Java Basics - Anfänger-Themen 11
D Casten eines Objekts: Funktion der Oberklasse aufrufen Java Basics - Anfänger-Themen 4
G Datentypen char to int casten - falsches Ergebnis! Java Basics - Anfänger-Themen 6
S casten array in int von float Java Basics - Anfänger-Themen 5
A Dynamisches casten Java Basics - Anfänger-Themen 19
C Probleme beim casten und Objekt zugriff Java Basics - Anfänger-Themen 12
P Klasse nach Element casten Java Basics - Anfänger-Themen 4
G Double casten Java Basics - Anfänger-Themen 8
O Object nach Double casten Java Basics - Anfänger-Themen 11
L Object[] in String[] casten Java Basics - Anfänger-Themen 7
V Gelesene FTP Datei richtig casten Java Basics - Anfänger-Themen 9
T Properties casten Java Basics - Anfänger-Themen 4
G Arrays casten? Java Basics - Anfänger-Themen 12
G string "null" in null casten Java Basics - Anfänger-Themen 3
M casten und Generics Java Basics - Anfänger-Themen 9
S Objekt Casten Java Basics - Anfänger-Themen 4
G String nach int casten Java Basics - Anfänger-Themen 5
G Vektor auslesen und als int Variable casten Java Basics - Anfänger-Themen 4
G String in Date casten. Java Basics - Anfänger-Themen 7
G String in Date casten Java Basics - Anfänger-Themen 4
G String in Long casten Java Basics - Anfänger-Themen 2
G Object[] [] nach vector casten. Java Basics - Anfänger-Themen 3
G printStackTrace(); in String casten Java Basics - Anfänger-Themen 3
G String in int casten Java Basics - Anfänger-Themen 2
G Integer[] nach int[] casten - wie? Java Basics - Anfänger-Themen 2
D Arrays casten Java Basics - Anfänger-Themen 12
G Casten ? Java Basics - Anfänger-Themen 3
HaukeG Casten to String und Vergleichen Java Basics - Anfänger-Themen 2
G ich komm nicht weiter -> String in int casten Java Basics - Anfänger-Themen 4
T Casten von Choice auf Vector oder Object[] Java Basics - Anfänger-Themen 14
B Vector nach float[] casten Java Basics - Anfänger-Themen 6
G String zu byte[] "casten"? Java Basics - Anfänger-Themen 3
M Hin und Her Casten Object->int und int->Object Java Basics - Anfänger-Themen 3
T Typsicheres casten eines Objects Java Basics - Anfänger-Themen 5
D Object[] in Liste casten? Java Basics - Anfänger-Themen 8
T Chaosprogrammierer hat einen fehler beim casten? Java Basics - Anfänger-Themen 5
J Attribut casten Java Basics - Anfänger-Themen 3
A Array mit generischen Typen casten? Java Basics - Anfänger-Themen 6
C Automatisches Casten => inkompatibel Java Basics - Anfänger-Themen 7
G Byte-Code einlesen und zu Hex casten Java Basics - Anfänger-Themen 2
T Object[] zu String[] casten? Java Basics - Anfänger-Themen 3
R Double nach Integer casten Java Basics - Anfänger-Themen 8
L Adresse in String[] casten Java Basics - Anfänger-Themen 6
M Object auf Interface casten? Geht das? Java Basics - Anfänger-Themen 21
U ArrayLists und Casten Java Basics - Anfänger-Themen 2
O TreeMap nach Object[] casten? Java Basics - Anfänger-Themen 3
M Casten bei Objekten? Java Basics - Anfänger-Themen 4
S casten von Interface zu Klasse unterbinden Java Basics - Anfänger-Themen 15
M long nach String casten Java Basics - Anfänger-Themen 2
U String nach Integer Casten. Java Basics - Anfänger-Themen 4
G Sting nach int casten Java Basics - Anfänger-Themen 13
A Object casten? Java Basics - Anfänger-Themen 3
R Casten Java Basics - Anfänger-Themen 3
F Casten: Object nach Array Java Basics - Anfänger-Themen 10
M Casten Java Basics - Anfänger-Themen 2
H komme mit casten nicht klar Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben