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

Informatiker Board » Themengebiete » Praktische Informatik » verständnis » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (2): [1] 2 nächste » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen verständnis
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
neuling96
unregistriert
verständnis Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
?
19.12.2014 19:56
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

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

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).

__________________
Syntax Highlighting fürs Board (Link)
19.12.2014 19:59 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

Object o= (Object) s bedeutet also object o erbt vom object s ??
19.12.2014 20:12
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

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

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.

__________________
Syntax Highlighting fürs Board (Link)
19.12.2014 20:26 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
19.12.2014 22:11
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

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

Ist das eine Frage?
Naja, wie auch immer, du hast recht smile

__________________
Syntax Highlighting fürs Board (Link)
20.12.2014 07:55 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

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

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
20.12.2014 16:52 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?
28.12.2014 21:46
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

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

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

__________________
Syntax Highlighting fürs Board (Link)
29.12.2014 07:57 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?
29.12.2014 08:50
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

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

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
29.12.2014 09:38 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

"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??
29.01.2015 00:17
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

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

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
29.01.2015 10:08 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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??
29.01.2015 13:57
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

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

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
29.01.2015 14:30 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Seiten (2): [1] 2 nächste » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » verständnis