Programmanalyse < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 20:19 Sa 11.12.2010 | Autor: | SolRakt |
Aufgabe | public class A {
public static double x = 1;
public A() {
this(4);
}
public A(double x) {
A.x += x;
}
public void f(double x) {
x += 2*x;
}
}
public class B extends A {
public int y = 3;
public B(int x) {
super();
y++;
}
public void f(int x) {
A.x += x;
}
public void f(double x) {
A.x -= x;
y--;
}
}
public class M {
public static void main(String[] args) {
A a = new A(A.x);
System.out.println(a.x); // OUT: 2.0
a.f(10);
System.out.println(a.x); // OUT: 2.0
B b = new B(10);
System.out.println(b.x+" "+b.y); // OUT: 6.0 4
b.f(10);
System.out.println(b.x); // OUT: 16.0
a = b;
a.f(1.0);
System.out.println(a.x+" "+b.y); // OUT: 15.0 3
a.f(10);
System.out.println(a.x); // OUT: 5.0
}
} |
Hallo. Kann mir vllt jemand erklären, wie die einzelnen Ergebnisse zustande kommen? Ich lerne grad für meine Klausur, aber muss dafür das verstehn. Vor allem beim zweiten, dass da 2.0 rauskommt, versteh ich nicht. Es wird ja die Methode f aufrufen. Danke sehr.
Gruß
EDIT: Hab in meiner Mitteilung eins meiner Probleme beschrieben.
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:42 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Hallo. Kann mir vllt jemand erklären, wie die einzelnen
> Ergebnisse zustande kommen? Ich lerne grad für meine
> Klausur, aber muss dafür das verstehn. Vor allem beim
> zweiten, dass da 2.0 rauskommt, versteh ich nicht. Es wird
> ja die Methode f aufrufen. Danke sehr.
Warum schreibst du nicht auf, warum du denkst, dass da etwas anderes als 2.0 herauskommt? Bzw. was du denkst warum was wo rauskommen sollte?
Dann koennten wir dir erklaeren, wo deine Denkfehler liegen...
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:51 Sa 11.12.2010 | Autor: | SolRakt |
Ok, gut.
Also, bei der ersten Anweisung
A a = new A(A.x);
wird doch ein Objekt der Klasse A mit dem Parameter A.x (also mit der Objektvariable x aus A) vom Typ A erzeugt. Stimmt das so? Die Referenzvariable, die auf das Objekt zeigt, ist hier a.
Da das Objekt von A erzeugt wird, hab ich mir natürlich gedacht, einfach in die Klasse A zu schaun und zudem, welche Konstruktor aufgerufen wird. Hier wäre es
public A(double x)
A.x += x;
A.x ist ja 1, deswegen ist diese gesamte Ausdruck gleich 2, natürlich 2.0 wegen double. Hab ich das alles bisher richtig verstanden?
So, nun wird ja
a.f(10);
System.out.println(a.x);
aufgerufen.
Aber da versteh ich die Ausgabe nicht. das die Variable a auf das Objekt von eben zeigt, muss ich wieder in A suchen. Und da wird doch dann
public void f(double x)
x += 2*x;
aufgerufen oder?
Aber da kommt doch nicht 2.0 raus? Das versteh ich nicht. Danke vielmals
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:59 Sa 11.12.2010 | Autor: | SolRakt |
Kann mir jemand neben meiner Mittelung auch erklären, was this(4) bedueten soll. ich weiß nur, dass das nicht dasselbe this wie bei this.x oder so sein soll, aber was ist das dann?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 22:47 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Kann mir jemand neben meiner Mittelung auch erklären, was
> this(4) bedueten soll. ich weiß nur, dass das nicht
> dasselbe this wie bei this.x oder so sein soll, aber was
> ist das dann?
Beachte, dass dieses this(4) in einem Konstruktor steht. Was das tut ist, einen anderen Konstruktor der gleichen Klasse aufzurufen, und zwar einen der ein Argument annimmt, welches hier 4 ist.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:55 Sa 11.12.2010 | Autor: | SolRakt |
Ok. Nur zur Sicherheit bzw, zum Verständnis. Würde nach this(4) also der Konstruktor
public A(double x)
A.x += x;
augrufen mit 4 als aktuellen Parameter?
EDIT: Wenn dem so wäre, so würde doch public A(4) genau 5 ergeben, aber warum ist die Ausgabe dann 6.0? Oder ist die Variable x jetzt immer noch 2.0, dann wärs 6.0, aber warum wäre es dann 2.0? Kann mir das dann jemand erklären. Danke sehr.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:19 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Ok. Nur zur Sicherheit bzw, zum Verständnis. Würde nach
> this(4) also der Konstruktor
>
> public A(double x)
> A.x += x;
>
> augrufen mit 4 als aktuellen Parameter?
Genau.
> EDIT: Wenn dem so wäre, so würde doch public A(4) genau 5
> ergeben, aber warum ist die Ausgabe dann 6.0? Oder ist die
> Variable x jetzt immer noch 2.0, dann wärs 6.0, aber warum
> wäre es dann 2.0? Kann mir das dann jemand erklären.
> Danke sehr.
Nun, A.x hat doch den Wert 2, wenn A() durch super() aus B() aufgerufen wird. Und 2 + 4 = 6.
(Beachte, dass A.x eine Klassenvariable ist, keine Objektvariable!)
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:24 Sa 11.12.2010 | Autor: | SolRakt |
Ah verstehe. Die Veränderung des A.x von 1 auf 2 bleibt also erhalten. Ich dachte, das würde 1 bleiben. aber verstehe das, denk ich xD Ähm, kannst du mir hier nochmal kurz helfen:
b.f(10);
System.out.println(b.x); // OUT: 16.0
a = b;
a.f(1.0);
System.out.println(a.x+" "+b.y); // OUT: 15.0 3
a.f(10);
System.out.println(a.x); // OUT: 5.0
Verstehe bis auf das letzte alle Schritte. Bei a= b wird ja nur die Referenz kopiert, also heißt das, dass man die Funktion aus B aufruft. Aber wie man beim letzten schritt auf 5.0 kommt verstehe ich nicht. Ich hab 25 raus. xD
Ich muss beim letzten Schritt doch die Funktion public void f(int x)
A.x += x; anschaun oder, aber A.x ist doch 15 und + x (also +10) ist doch nicht 5?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:27 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Ah verstehe. Die Veränderung des A.x von 1 auf 2 bleibt
> also erhalten. Ich dachte, das würde 1 bleiben. aber
> verstehe das, denk ich xD Ähm, kannst du mir hier nochmal
> kurz helfen:
>
> b.f(10);
> System.out.println(b.x); // OUT: 16.0
> a = b;
> a.f(1.0);
> System.out.println(a.x+" "+b.y); // OUT: 15.0 3
> a.f(10);
> System.out.println(a.x); // OUT: 5.0
>
> Verstehe bis auf das letzte alle Schritte. Bei a= b wird ja
> nur die Referenz kopiert, also heißt das, dass man die
> Funktion aus B aufruft. Aber wie man beim letzten schritt
> auf 5.0 kommt verstehe ich nicht. Ich hab 25 raus. xD
Klasse A hat eine Funktion virtual void f(double), und Klasse B ueberschreib diese durch eine eigene Funktion.
Wenn du a.f(10) aufrufst, a jedoch ein Objekt von der Klasse B ist, wird also B.f aufgerufen.
Und in B.f steht ein - anstelle eines +, deswegen 15 - 10 = 5 und nicht 15 + 10 = 25 :)
> Ich muss beim letzten Schritt doch die Funktion public void
> f(int x)
> A.x += x; anschaun oder, aber A.x ist doch 15 und + x (also
> +10) ist doch nicht 5?
Eben nicht, s.o.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:29 Sa 11.12.2010 | Autor: | SolRakt |
Ja, aber ist der Parameter (10) nicht vom Typ Integer? Die Funktion, die du meinst, ist doch für den Typ double. Und da es eine mit Int gibt, wird dann nicht die genutzt?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:32 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Ja, aber ist der Parameter (10) nicht vom Typ Integer? Die
> Funktion, die du meinst, ist doch für den Typ double. Und
> da es eine mit Int gibt, wird dann nicht die genutzt?
a ist aber eine Referenz auf ein Objekt vom Typ A. D.h. es wird geschaut, was A so fuer Methoden hat. Und A hat genau eine mit dem Namen f, und die will ein double haben. Deswegen wird die 10 zu einem double konvertiert und dann die Methode f(double) von a aufgerufen; da das Objekt, auf das a zeigt, vom Typ B ist, wird B.f(double) aufgerufen, welches A.f(double) ueberschreibt.
Die Funktion f(int), die das Objekt auf das a zeigt auch hat, "siehst" du (bzw. der Compiler) nur, wenn a eine Referenz auf ein Objekt vom Typ B waer.
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:38 Sa 11.12.2010 | Autor: | SolRakt |
Ist zwar kompliziert (finde ich xD), aber ich denke, dass ich das kapiert hab. Wenn nicht, melde ich mich zu dieser Frage nochmal, wenns dir nichts ausmacht. ;)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:44 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Ist zwar kompliziert (finde ich xD), aber ich denke, dass
> ich das kapiert hab. Wenn nicht, melde ich mich zu dieser
> Frage nochmal, wenns dir nichts ausmacht. ;)
Es ist auch kompliziert! Da hiflt eigentlich nur Uebung Also versuchen nachzuvollziehen was solche Programme wie aus der Aufgabenstellung machen, die gerade dazu gemacht worden sind solche "Feinheiten" zu veranschaulichen.
LG Felix
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 22:46 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Also, bei der ersten Anweisung
>
> A a = new A(A.x);
>
> wird doch ein Objekt der Klasse A mit dem Parameter A.x
> (also mit der Objektvariable x aus A) vom Typ A erzeugt.
Vorsicht! $x$ ist eine Klassenvariable (beachte das static), keine Objektvariable!
> Stimmt das so? Die Referenzvariable, die auf das Objekt
> zeigt, ist hier a.
>
> Da das Objekt von A erzeugt wird, hab ich mir natürlich
> gedacht, einfach in die Klasse A zu schaun und zudem,
> welche Konstruktor aufgerufen wird. Hier wäre es
>
> public A(double x)
> A.x += x;
>
> A.x ist ja 1, deswegen ist diese gesamte Ausdruck gleich 2,
> natürlich 2.0 wegen double. Hab ich das alles bisher
> richtig verstanden?
Soweit ja.
>
> So, nun wird ja
>
> a.f(10);
> System.out.println(a.x);
>
> aufgerufen.
>
> Aber da versteh ich die Ausgabe nicht. das die Variable a
> auf das Objekt von eben zeigt, muss ich wieder in A suchen.
> Und da wird doch dann
>
> public void f(double x)
> x += 2*x;
>
> aufgerufen oder?
>
> Aber da kommt doch nicht 2.0 raus? Das versteh ich nicht.
Nun, $x$ hat nachher den Wert $10.0 + 2 * 10.0$, also $30.0$. Allerdings $x$ ist hier eine lokale Variable. Und nicht die obige Klassenvariable A.x.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:53 Sa 11.12.2010 | Autor: | SolRakt |
Ach so, stimmt ja. ;) Ist ja eine lokale Variable. Aber der Unterschied zwischen Klassenvariable und Objektvariable ist mir noch nicht ganz klar. Ähm, ich erstell doch ein Objekt von der Klasse A und somit wäre x dann doch die Variable eines Objekts? Kannst du bitte für mich genauer erklären, warum das dann dennoch eine Klassenvariable ist. Bei abstrakten Klassen ist das ja klar, weil man davon kein Objekt erzeugen kann, oder?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:22 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Ach so, stimmt ja. ;) Ist ja eine lokale Variable. Aber der
> Unterschied zwischen Klassenvariable und Objektvariable ist
> mir noch nicht ganz klar.
Hab ich in der anderen Antwort gerade gemerkt
> Ähm, ich erstell doch ein Objekt
> von der Klasse A und somit wäre x dann doch die Variable
> eines Objekts?
Nein, x ist Variable der Klasse, da ein static davorsteht.
Beispiel:
1: |
| 2: | public class A
| 3: | {
| 4: | public static int a = 1;
| 5: | public int b = 2;
| 6: | }
|
Wenn du jetzt folgenden Code hast:
1: |
| 2: | A x = new A(), y = new A();
| 3: | y.a = 3;
| 4: | y.b = 4;
|
dann hat x.a den Wert 3 (weil a eine Kassenvariable ist), x.b jedoch den Wert 2 (weil das eine Objektvariable ist).
Die Klassenvariable teilen sich alle Objekte der gleichen Klasse, waehrend die Objektvariable bei jedem Objekt der Klasse eine andere ist (und verschiedene Werte annehmen kann).
Ist es jetzt etwas klarer?
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:24 Sa 11.12.2010 | Autor: | felixf |
Moin,
siehe auch hier.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:28 Sa 11.12.2010 | Autor: | SolRakt |
Hab ja auch Bücher, aber möchte diese, wie ich finde, Feinheiten lieber hier erklärt bekommen und zugegeben kannst du das auch gut.
Nur verstehe ich in deinem Beispiel jetzt was nicht.
a und b sind da doch beides Klassenvariablen, da static davorsteht oder? wieso hat x.a dann den wert 3. Kannst du dein beispiel bitte für mich nochmal genau erklären?
Danke dir.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:29 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Hab ja auch Bücher, aber möchte diese, wie ich finde,
> Feinheiten lieber hier erklärt bekommen und zugegeben
> kannst du das auch gut.
>
> Nur verstehe ich in deinem Beispiel jetzt was nicht.
>
> a und b sind da doch beides Klassenvariablen, da static
> davorsteht oder? wieso hat x.a dann den wert 3. Kannst du
> dein beispiel bitte für mich nochmal genau erklären?
Oops, da hab ich mich vertan. Da sollte kein static bei dem b stehen Ich aender das kurz...
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:33 Sa 11.12.2010 | Autor: | SolRakt |
Ach so ok. Aber so ganz verstehn tu ich das immer noch nicht xD Sry ;) Ähm, erklärs bitte nochmal kurz. warum ist x.a nochmal 3?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:38 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Ach so ok. Aber so ganz verstehn tu ich das immer noch
> nicht xD Sry ;) Ähm, erklärs bitte nochmal kurz. warum
> ist x.a nochmal 3?
Weil y.a auf 3 geaendert wurde, und a eine Klassenvariable von der Klasse A ist, und die bei jedem Objekt dieser Klasse den gleichen Wert hat. Wenn du also y.a aenderst, aenderst du auch x.a, und umgekehrt.
Du kannst sogar A.a aendern, ohne dass es ueberhaupt ein Objekt der Klasse A gibt.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:42 Sa 11.12.2010 | Autor: | SolRakt |
Boah, das hab ich aber jetzt sowas von kapiert xD Sry bin grad nur froh, dass ich das verstanden habe. Das hat der Prof in mehreren Vorlesungen nicht geschafft, aber egal. Ähm, nur noch eine ganz kleine Frage. Ich könnte A.a aber nicht ändern, wenn diese nicht static wäre und noch kein Objekt da wäre. Also müsste ich erst ein Objekt schaffen?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:43 Sa 11.12.2010 | Autor: | felixf |
Moin!
> Boah, das hab ich aber jetzt sowas von kapiert xD Sry bin
> grad nur froh, dass ich das verstanden habe. Das hat der
> Prof in mehreren Vorlesungen nicht geschafft, aber egal.
Ok :)
> Ähm, nur noch eine ganz kleine Frage. Ich könnte A.a aber
> nicht ändern, wenn diese nicht static wäre und ich noch
> kein Objekt wäre. Also müsste ich erst ein Objekt
> schaffen?
Exakt. Wenn a nicht static ist, macht es auch gar keinen Sinn den Wert zu aendern, wenn es kein Objekt ist, da es diese Variable erst "gibt", sobald du ein Objekt erzeugst, und jedes Objekt der Klasse A hat seine eigene Variable a.
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:47 Sa 11.12.2010 | Autor: | SolRakt |
Ok, versteh ich. Danke nochmal. Falls ich dennoch noch Fragen habe, schreib ich nochmal. Naja ich übe dann nochmal was. Gute Nacht :)
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:49 Sa 11.12.2010 | Autor: | SolRakt |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Sry hab doch noch ne Frage. Was ist, wenn der Konstruktor nicht existiert, den ich aufrufe? Bsp:
p u b l i c c l a s s A {
p u b l i c i n t x = 1 ;
p u b l i c A( ) {
t h i s ( 5 ) ;
}
p u b l i c A( double d ) {
t h i s ( ( i n t ) d / 3 ) ;
}
p u b l i c A( i n t i ) {
x += i ;
}
p u b l i c v o i d f ( double z ) {
t h i s . x += x + 1 ;
}
}
p u b l i c c l a s s B e x t ends A {
p u b l i c i n t y = 5 ;
p u b l i c v o i d f ( double x ) {
t h i s . x += x ;
y ++;
}
p u b l i c v o i d f ( i n t x ) {
y = 0 ;
}
}
p u b l i c c l a s s M {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
A a = new A( 7 . 0 ) ;
System . out . p r i n t l n ( a . x ) ; // OUT: [ ]
a . f ( 1 0 ) ;
System . out . p r i n t l n ( a . x ) ; // OUT: [ ]
B b = new B( ) ;
System . out . p r i n t l n ( a . x + " " + b . y ) ; // OUT: [ ] [ ]
b . f ( 1 0 . 0 ) ;
System . out . p r i n t l n ( b . x + " " + b . y ) ; // OUT: [ ] [ ]
a = b ;
a . f ( 1 . 0 ) ;
System . out . p r i n t l n ( a . x + " " + b . x ) ; // OUT: [ ] [ ]
a . f ( 2 ) ;
System . out . p r i n t l n ( a . x + " " + b . y ) ; // OUT: [ ] [ ]
beim dritten aufrug soll was rauskommen, aber den kostruktor gibts doch nicht?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 00:16 So 12.12.2010 | Autor: | felixf |
Moin!
Das war jetzt aber nicht sehr leserlich...
Also:
* A hat drei Konstruktoren: A() und A(int) und A(double)
* B wird von A abgeleitet, hat keinen (explizit angegebenen) Konstruktor
* Es wird ein Objekt vom Typ B erzeugt mit new B().
> beim dritten aufrug soll was rauskommen, aber den
> kostruktor gibts doch nicht?
Schau mal unter dem Stichwort Defaultkonstruktor. Wenn du keinen Konstruktor in einer Klasse explizit definierst, wird automatisch ein Konstruktor definiert, der Defaultkonstruktor. Der tut dasselbe als wenn du in der Klasse B schreibst
1: |
| 2: | public B()
| 3: | {
| 4: | }
|
Dieser Konstruktor ruft (wieder implizit) super() auf. Da A einen Konstruktor A() hat (egal ob implizit oder explizit; hier ist dies explizit der Fall) wird dieser aufgerufen.
Falls du allerdings das Beispiel so aenderst, dass A keinen expliziten (und damit gar keinen, da andere Konsrtuktoren da sind) Defaultkonstruktor A() mehr hat, dann wuerde das nicht funktionieren. Du wuerdest einen Fehler bekommen, da der Compiler nicht einfach mehr automatisch einen Defaultkonstruktor fuer B erzeugen kann (er wuesste ja nicht, was er mit den Argumenten bei den anderen Konstruktoren von A machen sollte).
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:55 So 12.12.2010 | Autor: | SolRakt |
Tut mir leid, hab nicht gemerkt, da das so blöd aussieht.
public class A {
public int x = 1;
public A(int x) {
this.x += x;
}
public A(double x) {
x += x;
}
public void f(double x) {
this.x = this.x + (int) (x + B.y);
}
}
public class B extends A {
public static int y = 3;
public int x = 0;
public B(double x) {
super((int) x);
}
public void f(int y) {
this.x = y * 2;
B.y = this.x;
}
public void f(double y) {
this.x = (int) y + B.y;
}
}
public class M {
public static void main(String[] args) {
A a = new A(B.y);
System.out.println(a.x); // OUT: 4
a.f(1);
System.out.println(a.x); // OUT: 8
B b = new B(3.0);
System.out.println(b.x); // OUT: 0
A z = b;
System.out.println(z.x); // OUT: 4
z.f(-5.0);
System.out.println(b.x + " " + z.x); // OUT: -2 4
z.f(-6);
System.out.println(b.x + " " + z.x); // OUT: -3 4
}
}
Tschuldige auch, wenn ich nochmal was frage muss xD Kannst jemand mir erklären, wie die dritte Ausgabe, als0 0, zustande kommt. Es wird also folgender Konstruktor ausgeführt.
public B(double x) {
super((int) x);
}
Da dort super steht, gehe ich in einen Konstruktor der Oberklasse, hier A und führe den Konstruktor aus:
public A(int x) {
this.x += x;
}
Aber da kommt doch nicht 0 raus?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:48 So 12.12.2010 | Autor: | felixf |
Moin,
1: |
| 2: | > public class A {
| 3: | > public int x = 1;
| 4: | > }
| 5: | > public class B extends A {
| 6: | > public int x = 0;
| 7: | > }
| 8: | > [...]
| 9: | > B b = new B(3.0);
| 10: | > System.out.println(b.x); // OUT: 0
|
>
> Tschuldige auch, wenn ich nochmal was frage muss xD Kannst
> jemand mir erklären, wie die dritte Ausgabe, als0 0,
> zustande kommt. Es wird also folgender Konstruktor
> ausgeführt.
>
> public B(double x) {
> super((int) x);
> }
>
> Da dort super steht, gehe ich in einen Konstruktor der
> Oberklasse, hier A und führe den Konstruktor aus:
>
> public A(int x) {
> this.x += x;
> }
>
> Aber da kommt doch nicht 0 raus?
Kommt es auch nicht. Aber A.x und B.x sind zwei verschiedene Variablen. A.x ist ungleich 0, B.x jedoch nicht. Und b.x greift auf B.x zu, weil b eine Referenz auf ein Objekt vom Typ B ist.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:07 So 12.12.2010 | Autor: | SolRakt |
Ach so. Aber woran seh ich das, dass das auf B.x zugreift? Ich hab grad ein Brett vorm Kopf und seh das irgendwie nicht. Danke.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:22 So 12.12.2010 | Autor: | felixf |
Moin!
> Ach so. Aber woran seh ich das, dass das auf B.x zugreift?
> Ich hab grad ein Brett vorm Kopf und seh das irgendwie
> nicht. Danke.
Weil b eine Referenz auf ein Objekt vom Typ B ist. Der Compiler guckt also zuerst, ob die Klasse B eine Variable mit dem Namen x hat. Wenn ja, wird diese genommen, wenn nein, guckt der Compiler bei der Klasse A nach, von der B abgeleitet ist. Hat die eine Variable mit dem Namen x, wird die genommen. Wenn nicht, schaut der Compiler nach von welcher Klasse A abgeleitet ist (hier: Object), usw. Wenn er die ganze Kette entlang nichts findet, liefert er einen Fehler.
Ansonsten wird halt der erste Treffer genommen. Und der ist hier B.x.
Wenn dagegen b eine Referenz auf ein Objekt vom Typ A ist, wuerde A.x genommen werden wenn du b.x schreibst.
LG Felix
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 15:42 Mo 13.12.2010 | Autor: | SolRakt |
Nochmal eine Frage.
public class A {
public static int x = 1;
public A() {
x += 2;
}
public int f(int y) {
return y + x;
}
public int f(double y) {
x = 0;
return (int)y;
}
}
public class B extends A {
public int y = 4;
public B(int x) {
super();
y += x;
}
public int f(double x) {
y += 5;
return (int)x * y;
}
}
public class M {
public static void main(String[] args) {
A a = new B(1);
System.out.println(A.x+" "+((B)a).y); // OUT: 3 5
int z = a.f(3.0);
System.out.println(((B)a).y+" "+z+" "+A.x); // OUT: 10 30 3
B b = (B)a;
z = b.f(4);
System.out.println((b.y+" "+z+" "+A.x); // OUT: 10 7 3
}
}
Beim ersten Aufruf wird doch eine Objekt der Klasse B vom Typ A erzeugt. Aufgrund impliziter Datentypkonvertierung ist dies auch erlaubt. Da das Objekt vom Typ A ist, erhält das Objekt nur die Klassenvariablen aus A, also gehört das y aus B nicht zum Objekt? Also, mir ist nicht ganz klar, wie der Compiler vorgeht wenn ein Objekt einer Klasse erzeugt wird, aber der Typ einer anderen Klasse dasteht. Kann man mir das bezüglich des ersten Aufrufs mal erklären, welche Veriablen jetzt zum Objekt gehören und wie der Compiler allgemein vorgeht-
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:20 Mi 15.12.2010 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|