Forum: PC-Programmierung Tortz "private" sichtbar?!


von Maxim (Gast)


Lesenswert?

1
class Test {
2
    
3
    private double x, y;
4
    
5
    Test(Test t) {
6
        this.x = t.x;
7
        this.y = t.y;
8
    }
9
}

Das ist ein Java-Quellcode. Warum kann ich hier auf x, y von t 
zugreifen, obwohl diese private sind? Ich befinde mich zwar in derselben 
Klasse, aber im anderen Objekt. Warum geht das trotzdem?

von Peter (Gast)


Lesenswert?

Ich kenne es nur von C++, da ist es auch so das die eigene Klasse auch 
auf Private zugreifen kann.

von Chris .. (dechavue)


Lesenswert?

Da bei C++/Java/C# der Zugriffsmodifier für die Klasse nicht für die 
Instanz zählt.

Die Methoden existieren ja nur einmal und bekommen als quasi 
unsichtbaren Parameter die Instanz mit.

Ist so auch am Logischten, weil wass wäre mit folgendem Konstrukt, soll 
das nur funktionieren wenn a==this ist, soll es nie Funktionieren? :
1
class Test {
2
    
3
    private double x, y;
4
    
5
    Test(Test t) {
6
        Test a = null;
7
        if (irgendwas) a = this;
8
        else           a = t;  
9
        
10
        a.x = a.y;
11
    }
12
}

Zudem wäre ohne diese Möglichkeit ein CCTor/eine Kopiermethode in vielen 
Fällen nicht oder nur sehr schwer möglich (und zwar wenn nicht für alle 
Members Setter existieren).

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

private sacehn sind generell inerhalb der gleichen (oder einer 
eingebetteten) Klasse "zugreifbar".

von Mike J. (Gast)


Lesenswert?

@ Maxim
Du machst dir aus der Klasse "Test" mittels new ein Obkejt(= Instanz 
einer Klasse).

Dieses Objekt kannst du dir als Haus vorstellen, alles was in dem Haus 
ist und was als privat eingestuft wurde kann man von außen nicht 
erreichen.

Also die Zugrifsmodifier gelten nur für jemanden der von außen auf das 
Objekt zugreifen möchte.

Stell dir vor du erstellst in deinem objekt eine Variable auf die du 
nicht zugreifen kannst ... das ist doch sinnlos.

(Wenn du deinen Wasserzähler in deinem Haus als public deklarierst kann 
der Versorger den Wert ablesen wann er will, er kann ihn aber auch 
einstellen wenn er mehr von dir kassieren möchte :( )

{c]
class Test {

    private double x, y;

    Test(Test t) {
        this.x = t.x;
        this.y = t.y;
    }

    // hier können andere Methoden -lesend- auf x zugreifen
    public getX(){
        return this.x;
    }
}
{/c]

Wenn du sie mit "public" freigibst ist deine Variable Freiwild und jeder 
kann mit ihr alles machen.


Achso ..
die Variablen sind (rotes Haus, 14cm Dämmung) also Eigenschaften und
die Methoden sind so etwas wie  (heizen, lüften .. )

von Karl H. (kbuchegg)


Lesenswert?

Mike J. wrote:

Du hast die Frage nicht verstanden

> Dieses Objekt kannst du dir als Haus vorstellen, alles was in dem Haus
> ist und was als privat eingestuft wurde kann man von außen nicht
> erreichen.

Genau. Und um in deinen Begriffen zu bleiben lautet die Frage:
Warum kann dann zwar nicht der Ableser zugreifen, wohl aber ein anderes 
Haus?

Und die Antwort darauf lautet, wie weiter oben schon festgestellt: Weil 
das Schutzkonzept pubilc/protected/private auf Klassenebene arbeitet und 
nicht auf Objektebene.

von Mike J. (Gast)


Lesenswert?

@ kbuchegg
Oh ... naja, okay.

Die Variable "private static int i; " ist doch eine Klassenvariable und 
wird auch mit private/public/protected/package geschützt.

er sagte jedenfalls:
> Warum kann ich hier auf x, y von t zugreifen,
> obwohl diese private sind?
Er hätte vielleicht ein paar andere Namen vergeben sollen:
1
class Punkt {
2
    
3
    private double x, y;
4
    
5
    setPunkt(Punkt t) {
6
        this.x = that.t.x;
7
        this.y = that.t.y;
8
    }
9
}
Das steht alles am Anfang eines jeden Javabuchs, aber das überlesen die 
meisten und blättern vor zur grafischen Oberfläche.

> Ich befinde mich zwar in derselben Klasse, aber im anderen Objekt.

Dann dachte ich mir dass er sich nicht im klaren ist dass er die Klasse 
kopiert und davon Objekte erzeugt.
... und irgendwie hätte er das schön geordnet und viel besser aus einem 
Buch entnehmen können, mit Beispieltexten.

http://www.galileocomputing.de/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.