Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will?

uuqfowehui23

Mitglied
Mir ist aufgefallen, dass wenn ich z. B. eine Klasse A habe, die Klasse A hat 3 private Variablen.

Dann kann ich, wenn ich in der Klasse B ein Objekt der Klasse A habe, nicht auf die 3 privaten Variablen zugreifen, in der Klasse A selber schon, wenn ich in der Klasse A ein Objekt von A erstelle warum?...
 
Beste Antwort
Ist korrekt.
Alle Methoden innerhalb der Klasse A können auf alle privaten Member (Konstruktoren, Methoden, Felder) derselben Klasse A zugreifen.
Wenn du außerhalb der Klasse A bist (in deinem Fall in einer Methode einer anderen Klasse B), dann kannst du dort _nicht_ auf private Member der Klasse A zugreifen.

Etwas anderes wäre es z.B., wenn du in Klasse A eine public Methode definierst, und diese von der Methode in Klasse B (auf einer Instanz von A) aufrufst und diese public Methode in A dann auf ein private Feld von A zugreift. Dann hast du dich ja _explizit_ dafür entschieden, den privaten Zustand (das Feld) von A nach außen zu veröffentlichen, durch eben die public Methode in A.

Die Sichtbarkeitsspezifizierer (wie "private"...

httpdigest

Top Contributor
Ist korrekt.
Alle Methoden innerhalb der Klasse A können auf alle privaten Member (Konstruktoren, Methoden, Felder) derselben Klasse A zugreifen.
Wenn du außerhalb der Klasse A bist (in deinem Fall in einer Methode einer anderen Klasse B), dann kannst du dort _nicht_ auf private Member der Klasse A zugreifen.

Etwas anderes wäre es z.B., wenn du in Klasse A eine public Methode definierst, und diese von der Methode in Klasse B (auf einer Instanz von A) aufrufst und diese public Methode in A dann auf ein private Feld von A zugreift. Dann hast du dich ja _explizit_ dafür entschieden, den privaten Zustand (das Feld) von A nach außen zu veröffentlichen, durch eben die public Methode in A.

Die Sichtbarkeitsspezifizierer (wie "private", "protected" und "public") sind also ein Mechanismus zur Kapselung (engl.: Information Hiding).

Die Frage ist also nicht, _was_ du aufrufst (private Methode in Klasse A), sondern _wer_ diese Methode aufruft (also von wo der Aufruf stattfindet) - in deinem Fall in einer Methode in einer anderen Klasse B.
 
Beste Antwort

uuqfowehui23

Mitglied
Ist korrekt.
Alle Methoden innerhalb der Klasse A können auf alle privaten Member (Konstruktoren, Methoden, Felder) derselben Klasse A zugreifen.
Wenn du außerhalb der Klasse A bist (in deinem Fall in einer Methode einer anderen Klasse B), dann kannst du dort _nicht_ auf private Member der Klasse A zugreifen.

Etwas anderes wäre es z.B., wenn du in Klasse A eine public Methode definierst, und diese von der Methode in Klasse B (auf einer Instanz von A) aufrufst und diese public Methode in A dann auf ein private Feld von A zugreift. Dann hast du dich ja _explizit_ dafür entschieden, den privaten Zustand (das Feld) von A nach außen zu veröffentlichen, durch eben die public Methode in A.

Die Sichtbarkeitsspezifizierer (wie "private", "protected" und "public") sind also ein Mechanismus zur Kapselung (engl.: Information Hiding).

Die Frage ist also nicht, _was_ du aufrufst (private Methode in Klasse A), sondern _wer_ diese Methode aufruft (also von wo der Aufruf stattfindet) - in deinem Fall in einer Methode in einer anderen Klasse B.
Okay danke
 

White_Fox

Top Contributor
Der Gedanke hinter einer Klasse ist es, das Verhalten eines Objektes zu beschreiben. Nach außen hin definierst du, WAS ein Objekt tut. Innerhalb der Klasse beschreibst du, WIE das Objekt etwas macht.

Wenn du z.B. eine Pizza bestellst, dann gibt es für dich als Kunden ein ganz klares Prozedere: Du rufst an und sagst was du willst. Dann steht jemand vor deiner Tür und drückt dir gegen Geld die Pizza in die Hand. Was zwischen deinem Anruf und dem Öffnen der Tür passiert, interessiert dich nicht und hat dich nicht zu interessieren. Z.B. ob die in der Pizzabäckerei eine Wagner warm machen oder selber backen. Und ob die Pizza von einem Mitarbeiter auf einen Fahrrad, Roller oder Auto gebracht wird, ob mit berittenem Boten oder per Hubschrauber genausowenig.
Es wäre natürlich denkbar, daß du dich um all das auch noch kümmerst, aber das wäre unsinnig.

Die Vorteile in der Programmierei sind vielfältig: Zum einen kannst du große Riesenprobleme in viele kleine, leicht verständliche und schnell lösbare Probleme zerlegen – der Kern der Ingenieurskunst schlechthin.
Außerdem machen Änderungen nicht dein ganzes Programm zunichte. Nimm z.B. eine Klasse, das Daten für dein Programm zur Verarbeitung liefert. Wenn die Daten nun anderswo herkommen sollen, z.B. willst du auf eine andere Datenbank umsteigen, so mußt du zwar eine Klasse umschreiben, aber der Rest deines Programms bekommt von dieser Änderung nix mit. Die Methoden, die die Klasse nach außen hin zur Verfügung stellt, haben denselben Namen, nehmen dieselben Parameter entgegen und liefern dieselben Daten zurück wie vorher.
Außerdem bieten dir Getter/Setter nachträglich z.B. Möglichkeiten zur Fehlerbehandlung an. Nimm z.B. mal an, du hast eine Klasse die in deinem Programm an sehr vielen Stellen verwendet wird. Diese Klasse hat einen Integerwert, und dieser Wert wird in deinem Programm – welches aus 5Mio Codezeilen besteht – an unzählig vielen Stellen per Direktzugriff gelesen und beschrieben.
Und zwei Jahre später stellt sich heraus: Dieses Integer darf niemals kleiner als 0 sein. Viel Spaß beim Codeeditieren.
Deutlich weniger Ärger würde so eine Änderung machen, wenn der Zugriff steht über Getter/Setter-Methoden erfolgt. Dann würdest du lediglich die eine Settermethode ändern müssen und wärst fertig.
 

fhoffmann

Top Contributor
Ich denke, dass es dem Fragesteller mehr darum geht, warum der Zugriff über die Klasse und nicht über das Objekt beschränkt ist.
Etwas eigenartig ist das ja schon:
Wenn ein Mensch (ein Objekt der Klasse Mensch) ein privates Geheimnis hat, kann jeder andere Mensch darauf zugreifen.
 

LimDul

Top Contributor
Eine interessante Frage, die ich nicht beantworten kann. Was als Grund aufgeführt wird - private soll wie oben beschrieben die interne Implementierung einer Klasse A vor anderen Klassen verstecken. So dass man sie frei anpassen kann. Damit ist es "ok" wenn ein Objekt a1 der Klasse A (was ja die interne Implementierung kennt) auf private Field des Objektes a2 der Klasse A zugreifen kann. Es ist ja die gleiche interne Implementierung.

Einen echten Vorteil bietet es bei der equals Methode - zwei Objekte sind oft equals, wenn ihr interner Zustand identisch ist. Diesen internen Zustand möchte man aber nicht von außen zugreifbar machen. Durch diese Regel kann man direkt auf den internen Zustand des anderen Objektes der gleichen Klasse zugreifen.
 

httpdigest

Top Contributor
Ob nun zwei Ausdrücke jeweils zum selben Objekt oder einem anderen Objekt (gemäß Identität) auswerten, lässt sich nicht zur Compilezeit entscheiden. Man hat sich bei Java nun mal eben dafür entscheiden, Zugriffsregeln zur Compilezeit* auszuwerten und zu enforcen. Ja, nebenbei gibt es natürlich auch noch die Java Core Reflection API, bei der diese Zugriffsregeln auch zur Laufzeit ausgewertet werden. Aber, in keinem Fall wird die Identität eines "aufrufenden Objektes" hier verwendet, sondern immer nur die statische Codestelle, bei der der Aufruf passiert.

Man kann also keinen Zustand eines Objektes der Klasse A von einem anderen Objekt (gemäß Objekt-Identität) der Klasse A "verstecken", weil man nicht weiß, ob das eine Objekt nicht auch dasselbe Objekt ist wie das andere.

EDIT:
*Korrektur: Genauer gesagt, zur Compilezeit _und_ zur Linking-Zeit vor dem ersten Zugriff (also während der Laufzeit).
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
C Comparator und private Variablen Java Basics - Anfänger-Themen 7
W Private Methode variablen übergeben..?! WIE! Java Basics - Anfänger-Themen 30
P zugriff auf private variablen Java Basics - Anfänger-Themen 5
G Zugriff auf private Variablen einer inneren Klasse Java Basics - Anfänger-Themen 5
A in abstract Klasse private Variablen Java Basics - Anfänger-Themen 3
G Variablen public oder private? Java Basics - Anfänger-Themen 9
M OOP frage, private variablen default-wert zuweisen sinnvoll? Java Basics - Anfänger-Themen 5
M Private Variable Java Basics - Anfänger-Themen 2
Gaudimagspam Attribute einfügen private Java Basics - Anfänger-Themen 3
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
Z private Klassenvariablen Java Basics - Anfänger-Themen 8
S Private int in Klasse Java Basics - Anfänger-Themen 4
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
J Klasse wird als private erkannt obwohl sie public deklariert ist Java Basics - Anfänger-Themen 3
shiroX Klassen Klasse/Methode private final jUnit-Fehler Java Basics - Anfänger-Themen 5
N Instanzvariablen als private... Java Basics - Anfänger-Themen 2
A Private Attribut aus fremder Klasse lesen ? Java Basics - Anfänger-Themen 19
P Methoden private int[] in main Java Basics - Anfänger-Themen 16
A Klassen Werte in den private Bereich übergeben Java Basics - Anfänger-Themen 5
C Collections: private Map Java Basics - Anfänger-Themen 4
M Wie private Methoden mit Asserstions testen? Java Basics - Anfänger-Themen 3
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
D Klassenvariablen standardmäßig private oder public? Java Basics - Anfänger-Themen 2
W private Array Loops Java Basics - Anfänger-Themen 4
B public/private nur 1x schreiben Java Basics - Anfänger-Themen 3
H Privat ist nicht mehr private Java Basics - Anfänger-Themen 7
J Vererbung Zugriff auf private Variable Java Basics - Anfänger-Themen 10
A Variablen lokale Variable als private? Java Basics - Anfänger-Themen 3
A private string array Java Basics - Anfänger-Themen 5
B auf private Variable durch eine Methode zugreifen Java Basics - Anfänger-Themen 8
J Probleme mit verschiedenen Private Klassen Java Basics - Anfänger-Themen 3
T public-private problem Java Basics - Anfänger-Themen 5
K Methoden als private deklarieren? Java Basics - Anfänger-Themen 13
K Protected und Private Deklaration Java Basics - Anfänger-Themen 8
F Im Konstruktor mit Settern auf private Attribute zugreifen - oder nicht? Java Basics - Anfänger-Themen 18
B Kapselung Klasse private, Konstruktor protected Java Basics - Anfänger-Themen 10
H NEtBeans: Fehler: XXX has private access... Java Basics - Anfänger-Themen 2
K Kapselung public / private verständis problem Java Basics - Anfänger-Themen 17
E einfache Frage zu private Java Basics - Anfänger-Themen 26
N public class -> public method -> variable private? Java Basics - Anfänger-Themen 10
K OOP Datenkapselung mittels private - length Attribut bei Array Java Basics - Anfänger-Themen 3
L Private Methode in Subklasse? Java Basics - Anfänger-Themen 2
S Private Class Problem Java Basics - Anfänger-Themen 17
K Kann man Private-Konstruktoren doch aurufen? Java Basics - Anfänger-Themen 8
Luk10 Vererben von private instanzvariablen Java Basics - Anfänger-Themen 20
A Allgemeine Frage zur Sichtbarkeit "private" Java Basics - Anfänger-Themen 5
berliner Klassen Vererbung und Zugriff auf innere private Variable Java Basics - Anfänger-Themen 22
G field public/private wann Java Basics - Anfänger-Themen 11
Spin private Frage Java Basics - Anfänger-Themen 16
G Private Messages versenden Java Basics - Anfänger-Themen 13
S Zugriffe über Private Instanzvariablen Java Basics - Anfänger-Themen 3
J Public / Private Keys speichern bzw. lesen? Java Basics - Anfänger-Themen 8
R Private Methoden von auserhalb aufrufen Java Basics - Anfänger-Themen 2
N private variable vom typ einer klasse Java Basics - Anfänger-Themen 20
G GUI Controls private oder public Java Basics - Anfänger-Themen 6
P Private Klassen Java Basics - Anfänger-Themen 4
F Frage zur Vererbung und Zugriffmodifikator private Java Basics - Anfänger-Themen 3
S private public Java Basics - Anfänger-Themen 5
R private / public Frage Java Basics - Anfänger-Themen 7
S private String text; -> "Illegal start of expression Java Basics - Anfänger-Themen 7
R Klasse nicht sichtbar(kein private-Fehler) Java Basics - Anfänger-Themen 2
G Public ,private,protected Java Basics - Anfänger-Themen 1
R Private Klasse in Applet nutzen? Java Basics - Anfänger-Themen 9
B Instanzvariablen private? Java Basics - Anfänger-Themen 5
M Sichtbarkeit von private Java Basics - Anfänger-Themen 2
A public/private/etc. Zusatz weglassen Java Basics - Anfänger-Themen 2
M [SOLVED]private Daten head - neues objekt? Java Basics - Anfänger-Themen 12
H Vererbung:private Java Basics - Anfänger-Themen 7
U public, private, protected und "default access" - Java Basics - Anfänger-Themen 14
T private final String oder final String? Was ist richtig? Java Basics - Anfänger-Themen 4
M Jede Variable als private, protected etc. deklarieren? Java Basics - Anfänger-Themen 7
U was macht "private" ? :) Java Basics - Anfänger-Themen 7
G private methode wird aus anderer klasse aufgerufen? Java Basics - Anfänger-Themen 3
megachucky wie bekomm ich ein private attribut aus einer andren klasse? Java Basics - Anfänger-Themen 18
H private anstatt public Java Basics - Anfänger-Themen 2
H public und private Java Basics - Anfänger-Themen 5
A Public/Private und wie importieren? Java Basics - Anfänger-Themen 13
ashi Variablen aufrufen Java Basics - Anfänger-Themen 17
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
C Konstruktoren und Variablen Java Basics - Anfänger-Themen 42
F Auf Variablen eines Konstruktors zugreifen Java Basics - Anfänger-Themen 4
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
Arif Vererbung Methodenvererbung mit finalen Variablen Java Basics - Anfänger-Themen 1
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
S Variablen Variablen in einer Schleife erstellen lassen Java Basics - Anfänger-Themen 11
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
F Variablen Werte einer Klasse überschreiben Java Basics - Anfänger-Themen 4
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
M Java Instanz-Variablen ? Java Basics - Anfänger-Themen 3
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
M Variablen umbenennen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen


Oben