ProgrammAnalyse

Nani17

Mitglied
Folgender Code:

Java:
public class A {
public static double x = 1;

public A() {
    this(4);
}
public A(double x){
    A.x= x+A.x;
}
public void f(double x) {
    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); --> 2.0
        a.f(10);
        System.out.println(a.x); --> 2.0
        B b = new B(10);
        System.out.println(b.x+ " " + b.y); --> 6.0     4
        b.f(10);
        System.out.println(b.x); --> 16
        a = b;
        a.f(1.0);
        System.out.println(a.x+" "+b.y); --> 15        3
        a.f(10);
        System.out.println(a.x); --> 5.0
        
    }

}

Hey,
Ich verstehe hierbei leider überhaupt nicht, wie man bei der letzten Ausgabe auf das Ergebnis 5.0 kommt. Ich hätte gedacht, dass man im letzten schritt bei a.f(10) System.out.println(a.x); die f Methode mit dem int verwendet und somit auf das Ergebnis 25 kommt, da der übergebene Parameter mit 10 ja einen int darstellt.......Komme einfach nicht drauf wieso hierbei die f Methode mit dem double verwendet wird? Ich habe noch ein wenig experimentiert und gesehen, dass die Zeile a = b eine entscheidende Rolle hierbei spielt, jedoch komm ich leider zu keinem Ergebnis. Kann mir das jmd vlt erklären?
Lg
 
Zuletzt bearbeitet von einem Moderator:

Gucky

Top Contributor
Einige lokale Variablen verdecken die Statischen, sodass nur auf die Lokalen zugegriffen wird und die Änderungen an diesen nach Verlassen der betreffenden Methode verworfen werden. So z.B. in der Methode A#f(int).
 

Nani17

Mitglied
Vielen Dank für die schnelle Antwort, aber ich habe das nicht ganz verstanden was du damit meintest mit den Überdecken der statischen Variablen und inwiefern das was mit der Verwendung der Methode von f(double x) zu tun hat...... Sry aber ich verstehe das leider überhaupt nicht......
LG
 

coco07

Bekanntes Mitglied
Die in der Methode f(double x):void deklarierte Variable in der Parameterliste ist eine sogenannte lokale Variable, welche du extra für diese Methode angelegt hast. Das bedeutet, am Ende der Methode wird diese Variable wieder verworfen. Du hast also neben der Klassenvariable noch eine lokale Variable und verdeckst damit die Klassenvariable. Das Ganze nennt sich shadowing und ist ein häufig gemachter Fehler bei Anfängern. Du kannst die Klassenvariable mit dem Klassennamen und einem gefolgtem "." aufrufen. Also Klassenname.Klassenvariable = ...;

Sorry für den fehlenden Codeblock, bin am Handy :)
Ps: Löse erstmal diese Probleme und dann sehen wir weiter...

Grüße coco07
 
Zuletzt bearbeitet:

coco07

Bekanntes Mitglied
Hey Nani,
ich kann das Ganze am Handy schlecht lesen aber wenn ich das richtig sehe, hast du in der Main Methode eine Variable vom Typ A mit dem Namen a deklariert. Dann gibst du dieser Variablen eine Referenz auf ein Objekt vom Typ B. Leider kennt deine Referenzvariable a die Methoden aus der Klasse B nicht. Deswegen wird nur die Methode aufgerufen, welche einen Double erwartet und castet den int Wer implizit zu einem double. Informiere dich mal über Überladung und Überschreibung von Methoden ;)

Grüße Coco07
 
Zuletzt bearbeitet:

Nani17

Mitglied
Das hat mir sehr geholfen, Dankeschön nochmals..... habe mir das angeschaut mit dem Überladen und es jetzt Klick gemacht:D

LG und Frohe Weihnachten euch allen :)
 

Ähnliche Java Themen

Neue Themen


Oben