verständnis

Neue Frage »

Auf diesen Beitrag antworten »
neuling96 verständnis

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
public class
Mensch{
int alter;
publicMensch(intalter){
this.alter =alter;}
public String toString(){
return"Mensch(" + alter + ")";}
}
public classStudent extends Mensch{
intmatrnr;
publicStudent(
intalter,
intmatrikelnummer){
super(alter);
this.matrnr =matrikelnummer;
}
public String toString(){
return
"Student(" + matrikelnummer + ")";}
}
Die Klassen werden folgendermaßen verwendet:
Student s =
new
Student(20, 12345);
Object o = (Object) s;
Mensch m = (Mensch) s;
System.out.println(o.toString());
// 1)
System.out.println(m.toString());
// 2)
System.out.println(s.toString());
// 3)


zunächst die frage was genau machen

Object o = (Object) s;
Mensch m = (Mensch) s;
?
 
Auf diesen Beitrag antworten »
eulerscheZahl

Der Student ist ja ein Mensch (erbt von ihm), also kann man seinen Typ auch zum Mensch umwandeln (casten). Wenn es sich aber um einen Menschen handelt und nicht um einen Studenten, wirkt sich das auch auf toString aus. Für Object gilt das selbe (alle Klassen erben von Object).
Auf diesen Beitrag antworten »
neuling96

sry ich steh immer noch aufm schlauch
Object o = (Object) s;

Object o= (Object) s bedeutet also object o erbt vom object s ??
Auf diesen Beitrag antworten »
eulerscheZahl

Nein.
Vergiss erst mal das Objekt und konzentriere dich nur auf Student/Mensch.

public class Student extends Mensch beasgt, dass Student von Mensch erbt.
Mensch m; heißt: es gibt eine Instanz vom Typ Mensch. Nennen wir sie m.
m = (Mensch) s;: wandle s in einen Menschen um. weise das Ergebnis dem Menschen m zu.

mit dem Objekt ist es dasselbe, nur dass extends Object nicht extra dazugeschrieben werden muss.
 
Auf diesen Beitrag antworten »
neuling96

Student s =new Student(20, 12345);

publicStudent(intalter,intmatrikelnummer){
super(alter);
this.matrnr =matrikelnummer;
}

erstellt?


sodass mit

s.toString auf

public String toString(){
return
"Student(" + matrikelnummer + ")";}
}

schließlich liefert

Student(1234)

m = (Mensch) s;

m.toString

muss auch
Student(1234) liefern da bei
Objekttypen stehen auf den Variablenzetteln nicht die tatsächlichen Objekte
,
sondern die entsprechenden Referenzen darauf

also wird durch
m = (Mensch) s; auf die Referenz vom Student(20,1234) verwiesen
Auf diesen Beitrag antworten »
eulerscheZahl

Ist das eine Frage?
Naja, wie auch immer, du hast recht smile
Auf diesen Beitrag antworten »
Karlito

Der Cast ist unnötig, da jeder Student bereits ein Mensch ist. Man muss nur casten, wenn die Zuweisung nicht eindeutig ist. Beispielsweise ist jeder Student ein Mensch, aber nicht jeder Mensch ein Student. Hat man jedoch eine Variable vom Typ Mensch, bei der man weiß, dass es ein Student ist, so kann man die Referenz nur einer Variablen vom Typ Student zuweisen, wenn man vorher castet. Beispiel:

code:
1:
2:
3:
4:
5:
6:
7:
8:
Student s = new Student();
Mensch m  = s; //geht problemlos
m = new Mensch();
s = (Student) m; //Schlägt fehl, da m kein Student ist.
m = new Student(); //Geht, da Studenten Menschen sind
s = (Student) m; //Geht, da m eine Referenz auf einen Studenten war


Gruß,

Karlito
Auf diesen Beitrag antworten »
neuling96

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
dpublic class
Mensch{
int alter;
publicMensch(intalter){
this.alter =alter;}
public String toString(){
return"Mensch(" + alter + ")";}
}
public classStudent extends Mensch{
intmatrnr;
publicStudent(
intalter,
intmatrikelnummer){
super(alter);
this.matrnr =matrikelnummer;
}
public String toString(){
return
"Student(" + matrikelnummer + ")";}
}
Die Klassen werden folgendermaßen verwendet:
[B] public static void main(String[] args) {[/B]
Student s =
new
Student(20, 12345);
Object o = (Object) s;
Mensch m = (Mensch) s;
System.out.println(o.toString());
// 1)
System.out.println(m.toString());
// 2)
System.out.println(s.toString());
// 3)
}


was wäre wenn man eine main zeile hinzufügen würde, was passiert jetzt?
Auf diesen Beitrag antworten »
eulerscheZahl

Der Code steht an dieser Stelle bzw. wird von der main aufgerufen. Er kann ja nicht einfach außerhalb einer Klasse sein.
Auf diesen Beitrag antworten »
neuling96

public static void main(String[] args) {
Student s =
new
Student(20, 12345);
Object o = (Object) s;
Mensch m = (Mensch) s;

// 1)
System.out.println(m.toString());

der main ist m als mensch bekannt muss es dann nicht
public String toString(){
return"Mensch(" + alter + ")";}
} ausgeführt werden?
Auf diesen Beitrag antworten »
Karlito

Hallo neuling96,

ein Student ist ja ein Mensch. Jedoch ein spezieller Mensch. Deswegen verhält er sich auch anders als "normale Menschen". Du kannst den Studenten nur einer Variable vom Typ Mensch zuweisen, weil er vom Typ Mensch erbt. Es bleibt aber ein Student mit all den geänderten Eigenschaften. Nur dass sich die Sicht auf das Objekt durch die Zuweisung auf eine Variable vom Typ Mensch dann nur noch auf die Eigenschaften und Methoden beschränkt, die Menschen und Studenten gemeinsam haben. D.h. Wenn der Student noch eine Methode "studieren()" hätte, so ist diese Methode nach der Zuweisung auf eine Variable vom Typ Mensch nicht mehr zugreifbar.

War das verständlich?

Gruß,

Karlito
Auf diesen Beitrag antworten »
neuling96

"Typumwandlungen von Referenz-Datentypen unterscheiden sich von Umwandlungen der primitiven Datentypen darin, dass nicht die Objekte selbst verändert werden, sondern nur der Datentyp der entsprechenden Referenzen. Es wurd somit nur die Zugriffsart auf die Objekte geändert"


Was bedeutet Datentyp der entsprechenden Referenzen wird verändert?

Student s = new Student(20, 12345);
Mensch m = (Mensch) s;


Student s = new Student(20, 12345); damit haben ein Objekt von TYP Student erzeugt und s zeigt auf die Referenz ??
Die Referenz ist die Speicheradresse

Mensch m = (Mensch) s;
Was passiert mit der Referenz von s??

Muss man das so verstehen
Die Main kennt m als Objekt von, aber die Referenz von s zeigt immer noch auf ein Objekt von Student??
Auf diesen Beitrag antworten »
Karlito

Zitat:
Original von neuling96
Student s = new Student(20, 12345); damit haben ein Objekt von TYP Student erzeugt und s zeigt auf die Referenz ??


s ist die Referenz. Ein Objekt liegt irgendwo im Speicher. In den Variablen wird die Referenz auf dieses Objekt gespeichert.

Zitat:
Original von neuling96
Muss man das so verstehen
Die Main kennt m als Objekt von, aber die Referenz von s zeigt immer noch auf ein Objekt von Student??


m ist nach dem Cast eine Referenz auf das selbe Objekt, nur hat sich der Typ der Referenz geändert. Damit wird das Objekt einfach nur anders behandelt, nämlich jetzt als Mensch und nicht mehr als Student. Der Cast ist übrigens unnötig, da jeder Student bereits ein Mensch ist.

Edit: Eine Referenz ist eigentlich nur eine Adresse im Speicher. Der Typ der Referenz entscheided darüber wie mit der Adresse im Speicher umgegangen wird, bzw. wie der Speicher ab dieser Stelle interpretiert wird. Für die Hardware sind alles nur Bytes. Der CPU ist auch egal was Du mit dieser Menge von Bytes machst. Das Typsystem von Java sichert erst, dass du diese Menge von Bytes nicht einfach mit einer Zahl multiplizierst, die CPU würde diesen Unsinn einfach Stur machen. In C und C++ ist soetwas auch relativ einfach möglich, wodurch C und C++ so "gefährlich" sind. Man hat damit zwar maximale Kontrolle über das, was alles intern passiert aber mit großer Macht kommt große Verantwortung Augenzwinkern

Gruß,

Karlito
Auf diesen Beitrag antworten »
neuling96

Sry, ich habe immer noch Schwierigkeiten beim casten zu Verstehen, wie das mit den Referenzen abläuft

wir haben im bsp 2 tostring() Methoden wenn

Mensch m = new Mensch(25) ;
System.out.println(m.toString());// liefert Mensch(25), das ist soweit klar

Mensch n=new Student(20, 12345);
System.out.println(n.toString());// liefert Student(12345), da Methoden dynamisch gebunden werden,
es wird erst zur Laufzeit entschieden, von Klasse das Objekt ist, also wird die tostring() Methode von Student ausgeführt.

Tritt beim casting der gleiche Effekt ein? also hier
Student s = new Student(20, 12345);
Mensch m = (Mensch) s;
System.out.println(m.toString());


"Eine Referenz ist eigentlich nur eine Adresse im Speicher. Der Typ der Referenz entscheided darüber wie mit der Adresse im Speicher umgegangen wird, bzw. wie der Speicher ab dieser Stelle interpretiert wird."



Betrachten wir wieder
Student s = new Student(20, 12345);
Mensch m = (Mensch) s;


Zu Complierzeit, zeigt die Referenz auf ein Objekt von der Klasse Mensch
aber zur Laufzeit, zeigt die Referenz auf ein Objekt von der Klasse Student??
Auf diesen Beitrag antworten »
Karlito

Hallo neuling96,

Zitat:
Original von neuling96
Student s = new Student(20, 12345);
Mensch m = (Mensch) s;


Es wird ein Objekt vom Typ Student angelegt und eine Referenz auf dieses Objekt der Variablen s Zugeordnet. "Student s" besagt, dass s eine Referenz auf ein Objekt vom Typ Student ist.

"Mensch m = (Mensch) s;" ändert nur den Typen der Referenz. D.h. es wird weiterhin ein Objekt vom Typ Student referenziert. Daher verhält es sich auch wie ein Student. Es ändert sich nur die Sichtweise auf dieses Objekt. D.h. man kann mit der Variable nur noch so arbeiten wie mit einem Menschen und hat alles, was in der Klasse Student definiert nicht mehr zur Verfügung. Trotzdem verhält sich das Objekt immernoch wie ein Student, da das referenzierte Objekt ja ein Student bleibt.

Gruß,

Karlito
Auf diesen Beitrag antworten »
neuling96

vielen Dank das klingt einleutend smile

Falls sich weitere Fragen ergeben, werde ich nachfragen großes Grinsen
Auf diesen Beitrag antworten »
Karlito

Gerne! Daumen hoch
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »