private Instanzvaribalen bei "Innerer-Vererbung"

Status
Nicht offen für weitere Antworten.
S

stev.glasow

Gast
Folgener Code:
Code:
package test;

public class Hugo {
   
    private int x = 0;
    
    public void foo(Hugo o){
        System.out.println(o.x);
        System.out.println(this.x);
    }
    
    public static class HugoExtA extends Hugo{
        public void foo(Hugo o){
            System.out.println(o.x); // Zugriff
            System.out.println(this.x); // kein Zugriff
        }
    }
}

class HugoExtB extends Hugo{
    public void foo(Hugo o){
        System.out.println(o.x); // kein Zugriff
        System.out.println(this.x);  // kein Zugriff
    }
}

Warum die Klasse HugoExtB keinen Zugriff auf o.x. und this.x ist klar, nur wieso hat die Innere Klasse keinen Zugriff auf this.x aber zugriff auf o.x? :shock:
Weil HugoExtA ja zu der Klasse Hugo "gehört" bin ich jetzt immer davon ausgegangen dass sie so wohl auf dem einen als auch auf den anderem Object die nötige Berechtigung bekommt, aber dem Scheint nicht so.
 
B

bygones

Gast
versteh das Problem nicht so recht

per this greifst du auf Felder der eigenen Klasse hinzu. Beide abgeleiteten Klassen haben keine Variable x, ergo gibt es keinen Zugriff drauf.

Lässt du in HugoExtA das this einfach weg ist der Zugriff auf die Variable der äußeren Klasse möglich
 
S

stev.glasow

Gast
Was'n das - hast aber recht: mit super.x geht's.

Naja, lol:
Code:
package test;

public class Hugo {
   
    private int x = 0;
    public int y = 0;
     
    public static class HugoExtA extends Hugo{
        public void foo(Hugo o){
            System.out.println(o.x); // Zugriff
            System.out.println(this.x); // kein Zugriff
            System.out.println(super.x); // Zugriff
            
            System.out.println(o.y); // Zugriff
            System.out.println(this.y); // Zugriff
            System.out.println(super.y); // Zugriff
        }
    }
}

:autsch:
 

Bleiglanz

Gesperrter Benutzer
dass der Zugriff auf o.x erlaubt ist, liegt wahrscheinlich an den Feinheiten der JLS in Bezug auf "innere Klassen - Scopes - Zugriffe - usw."

dass der Zugriff auf this.x verboten ist ist doch klar: HugoExtA ist statisch - und das "this" bezieht sich nunmal auf die HugoExtA instanz; während o ja ein Hugo ist

wenn das static nicht da wäre, dann könnte man wahrscheinlich mit "Hugo.this.x" rankommen
 
S

stev.glasow

Gast
Bleiglanz hat gesagt.:
dass der Zugriff auf this.x verboten ist ist doch klar: HugoExtA ist statisch - und das "this" bezieht sich nunmal auf die HugoExtA instanz; während o ja ein Hugo ist
Und warum geht dann this.y?


Bleiglanz hat gesagt.:
wenn das static nicht da wäre, dann könnte man wahrscheinlich mit "Hugo.this.x" rankommen
jop
 
S

stev.glasow

Gast
Das seh ich auch ;)
Aber was hast das damit zu tun? Da wiederspricht sich doch was.
Bzw was das mit dem static zu tun hat, dass this.x nicht geht versteh ich nicht.
 

pogo

Bekanntes Mitglied
stevg hat gesagt.:
Das seh ich auch ;)
Aber was hast das damit zu tun? Da wiederspricht sich doch was.
Bzw was das mit dem static zu tun hat, dass this.x nicht geht versteh ich nicht.
wieso? dadurch ist die variable im kompletten package sichtbar, also auch in der inneren klasse
 
S

stev.glasow

Gast
Das Bezug sich auch mehr auf die Bründung mit dem static, die ich wohl nicht verstanden habe ...
[edit]
übrigens: ((Hugo)this).x geht auch.
 

messi

Bekanntes Mitglied
Ihr müsst bedenken, dass der Zugriff auf private Methoden und Felder einer umschließenden Klasse durch statische Methoden simuliert wird. Normal darf niemand außer die Klasse selbst auf private Methoden und Felder zugreifen. Damit aber innere Klassen es dennoch können, werden solche Methoden erstellt:
Code:
class Hugo {
    private int x;

    static int access$000(Hugo o) {
        return o.x;
    }

    static void access$001(Hugo o, int value) {
        o.x = value;
    }
}
test.Hugo:
Code:
static int access$000(test.Hugo);
  Signature: (Ltest/Hugo;)I
  Code:
   0:   aload_0
   1:   getfield        #1; //Field x:I
   4:   ireturn
test.Hugo.HugoExtA
Code:
public void foo(test.Hugo);
  Signature: (Ltest/Hugo;)V
  Code:
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   aload_1
   4:   invokestatic    #3; //Method test/Hugo.access$000:(Ltest/Hugo;)I
   7:   invokevirtual   #4; //Method java/io/PrintStream.println:(I)V
   10:  return
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
temi Private statische Hilfsmethoden Allgemeine Java-Themen 33
G Public oder Private oder Protected Sinn Allgemeine Java-Themen 14
J private and arrays Allgemeine Java-Themen 2
Thallius Warum ist meine private porperty public? Allgemeine Java-Themen 7
J private static final String variable Allgemeine Java-Themen 8
Thallius Wie verstecke ich meinen private Key am besten im Code? Allgemeine Java-Themen 10
N Vererbung Static & private fields - Nicht ganz einfach? Allgemeine Java-Themen 4
L Private Key aus KeyDatei extrahieren Allgemeine Java-Themen 2
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
G Testcases mit Junit auf private-Methode Allgemeine Java-Themen 7
S private ignorieren Allgemeine Java-Themen 7
Z aus private List<???> list eintrag löschen Allgemeine Java-Themen 4
P Private und public Allgemeine Java-Themen 2
tfa Unit-Tests für private Methoden Allgemeine Java-Themen 25
S In Subklasse auf private Variablen zugreifen Allgemeine Java-Themen 4
A Private-Wert eines Objekts auslesen Allgemeine Java-Themen 9
F Javadoc: @value tag nicht für private fields? Allgemeine Java-Themen 11
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
reibi Aufruf eines private Konstruktors Allgemeine Java-Themen 7
J Java Private Edition? Allgemeine Java-Themen 7
M Stärkerer access-modifier als "private"? Allgemeine Java-Themen 17
F Ein interface und private Methoden? Allgemeine Java-Themen 13
S private Vars in abstrakter Klasse nicht in der Unterklasse? Allgemeine Java-Themen 6
T ungewollter Zugriff auf private Variablen? Allgemeine Java-Themen 3
S private Methoden benutzen Allgemeine Java-Themen 11
G private vs. public JRE Allgemeine Java-Themen 3
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
C Klassen Warning "synthetic access" bei innerer Klasse Allgemeine Java-Themen 15
S Innerer Type einer generischen Collection herausfinden? Allgemeine Java-Themen 13
S grafische Oberfläche-> auslagern innerer klassen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben