matheraum.de
Raum für Mathematik
Offene Informations- und Nachhilfegemeinschaft

Für Schüler, Studenten, Lehrer, Mathematik-Interessierte.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Mathe
  Status Schulmathe
    Status Primarstufe
    Status Mathe Klassen 5-7
    Status Mathe Klassen 8-10
    Status Oberstufenmathe
    Status Mathe-Wettbewerbe
    Status Sonstiges
  Status Hochschulmathe
    Status Uni-Analysis
    Status Uni-Lin. Algebra
    Status Algebra+Zahlentheo.
    Status Diskrete Mathematik
    Status Fachdidaktik
    Status Finanz+Versicherung
    Status Logik+Mengenlehre
    Status Numerik
    Status Uni-Stochastik
    Status Topologie+Geometrie
    Status Uni-Sonstiges
  Status Mathe-Vorkurse
    Status Organisatorisches
    Status Schule
    Status Universität
  Status Mathe-Software
    Status Derive
    Status DynaGeo
    Status FunkyPlot
    Status GeoGebra
    Status LaTeX
    Status Maple
    Status MathCad
    Status Mathematica
    Status Matlab
    Status Maxima
    Status MuPad
    Status Taschenrechner

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Dt. Schulen im Ausland: Mathe-Seiten:Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
StartseiteMatheForenJavaProgrammanalyse
Foren für weitere Schulfächer findest Du auf www.vorhilfe.de z.B. Geschichte • Erdkunde • Sozialwissenschaften • Politik/Wirtschaft
Forum "Java" - Programmanalyse
Programmanalyse < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Java"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Programmanalyse: Hilfe/Erklärung
Status: (Frage) reagiert/warte auf Reaktion Status 
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.

        
Bezug
Programmanalyse: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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


Bezug
                
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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





Bezug
                        
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                                
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                        
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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.

Bezug
                                                
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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




Bezug
                                                        
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                                                                
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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



Bezug
                                                                        
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                                                                                
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                                                        
Bezug
Programmanalyse: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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. ;)

Bezug
                                                                                                
Bezug
Programmanalyse: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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


Bezug
                        
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                                        
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                
Bezug
Programmanalyse: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 23:24 Sa 11.12.2010
Autor: felixf

Moin,

siehe auch []hier.

LG Felix


Bezug
                                                
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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.

Bezug
                                                        
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                                
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                                                                        
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                                                
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                                                                                        
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                                                                
Bezug
Programmanalyse: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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 :)

Bezug
                                                                                                        
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                                                                                                                
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                                                                                        
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                                                                                                                                
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                                                                                                        
Bezug
Programmanalyse: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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.

Bezug
                                                                                                                                                
Bezug
Programmanalyse: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                                                                                                                        
Bezug
Programmanalyse: Frage (überfällig)
Status: (Frage) überfällig Status 
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-

Bezug
                                                                                                                                                                
Bezug
Programmanalyse: Fälligkeit abgelaufen
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 16:20 Mi 15.12.2010
Autor: matux

$MATUXTEXT(ueberfaellige_frage)
Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Java"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.matheraum.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]