2014-11-23 10 views
6

So stieß ich auf ein Beispiel in einem Java-Buch, das ich gefunden:Ändern private Instanzvariablen in Java

public class Account { 
    private String name; 
    private double balance; 
    private int acctNumber; 

    public Account(){} 

    public boolean equals(Account anotherAcc) { 
     return (this.name.equals(anotherAcc.name) 
       && (this.balance == anotherAcc.balance) && (this.acctNumber == anotherAcc.acctNumber)); 

    } 


} 

Wir sehen, dass die Methode equals überlastet ist und mit einem anderen Konto-Objekt übergibt, wenn alle Instanz zu überprüfen Variablen sind gleich. Mein Problem mit diesem Code ist, dass es so aussieht, als ob wir direkt auf private Variablen im anotherAcc Objekt zugreifen, was nicht richtig erscheint, aber es funktioniert. Das gleiche passiert, wenn ich eine Hauptmethode in der gleichen Klasse mache, in der ich irgendwie Zugang zu den privaten Variablen bekomme.

Umgekehrt, wenn ich eine Hauptmethode in einer anderen Klasse erstellen, ist es nur dann bekomme ich einen Sichtbarkeitsfehler. Meine Frage ist, warum erlaubt Java den Zugriff auf private Instanzvariable in einem Objekt, das in einer Methode übergeben wird? Liegt es daran, dass das Objekt vom Typ Konto ist und die Methode, an die es übergeben wird, Teil einer Klasse ist, die als Konto bezeichnet wird?

+2

Beachten Sie, dass der richtige Weg zum Überschreiben von 'equals' darin besteht,' public boolean equals (Object other) zu überschreiben ' – Philipp

+0

Ich denke, Sie sollten den Link sehen, warum wir private Variablen in OOP benötigen http://programmers.stackexchange.com/ Fragen/143736/why-do-we-need-private-Variablen – Muhammad

+0

Fügen Sie die Annotation @Override über Ihre equals-Methode und sehen, was passiert .. – Shmoopy

Antwort

9

See (mein Lieblingstisch) Controlling Access to Members of a Class:

Modifier Class Package Subclass World 
------------------------------------------- 
public  Y  Y  Y   Y 
protected Y  Y  Y   N 
no modifier Y  Y  N   N 
private  Y  N  N   N 
      ↑ 
     You are here 

Da Sie in der gleichen Klasse sind, private Mitglieder sind zur Verfügung. Wie in den Kommentaren erwähnt, beachten Sie, dass Sie nicht die korrekte equals Methode überschreiben. Das Original (der Klasse Object) erwartet ein Objekt vom Typ Object als Argument.

+0

Er sagte nie, er überschreibt 'equals', aber überladen es. – wvdz

+0

Ich sehe. Dies geschieht nur aufgrund der Tatsache, dass das übergebene Objekt der gleichen Klasse angehört, richtig? Dies würde offensichtlich für keinen anderen Objekttyp gelten. – Dimitri

2

private beschränkt den Zugriff auf Code in der gleichen Klasse, nicht nur die gleiche Instanz.

3

Liegt das daran, dass das Objekt vom Typ Konto ist und die Methode, an die es übergeben wird, Teil einer Klasse namens Account ist?

Ja bedeutet private nicht nur das Objekt, sondern ein beliebiges Objekt zu denselben class gehört, kann auch zugreifen.

Verwandte Themen