3 votes

Pourquoi suis-je capable d'appeler une méthode privée ?

Je ne devrais pas pouvoir invoquer une méthode privée d'un objet instancié. Je me demande pourquoi le code ci-dessous fonctionne.

public class SimpleApp2 {
    /**
     * @param args
     */
    private int var1;

    public static void main(String[] args) {
        SimpleApp2 s = new SimpleApp2();
        s.method1(); // interesting?!
    }

    private void method1() {
        System.out.println("this is method1");
        this.method2(); // this is ok
        SimpleApp2 s2 = new SimpleApp2();
        s2.method2(); // interesting?!
        System.out.println(s2.var1); // interesting?!
    }

    private void method2() {
        this.var1 = 10;
        System.out.println("this is method2");
    }
}

Je comprends qu'une méthode privée est accessible depuis l'intérieur de la classe. Mais si une méthode à l'intérieur d'une classe instancie un objet de cette même classe, les règles de portée ne devraient-elles pas s'appliquer à cet objet instancié ?

Une méthode statique comme main peut-elle accéder à un membre non statique de la classe, comme indiqué dans cet exemple ?

13voto

RichieHindle Points 98544

Su main est une méthode de SimpleApp pour qu'il puisse appeler SimpleApp Les méthodes privées de l'entreprise.

Ce n'est pas parce que c'est un static n'empêche pas qu'elle se comporte comme une méthode pour les besoins de l'application public , private etc. private empêche uniquement les méthodes de autre de l'accès aux classes SimpleApp Les méthodes de l'UE.

3voto

Oli Charlesworth Points 148744

Parce que main est également membre de SimpleApp .

3voto

Mind Peace Points 300

Voir le tableau ci-dessous

Modificateurs d'accès

                     **Same Class    Same Package   Subclass   Other packages**
**public**                Y               Y            Y              Y
**protected**             Y               Y            Y              N
**no access modifier**    Y               Y            N              N
**private**               Y               N            N              N

Comme votre méthode se trouve à l'intérieur de la voiture, elle est accessible selon la règle du pouce ci-dessus.

2voto

Marcelo Points 6708

De la Tutoriel Java :

modificateur privé - le champ n'est accessible que dans sa propre classe

En main se trouve dans la même classe que la méthode privée et y a donc accès.

2voto

cHao Points 42294

private signifie "seuls les éléments de cette classe peuvent s'en servir". C'est n'a pas signifie "seule cette instance peut appeler ses méthodes", ce qui semble être ce que vous attendez. Tout code dans SimpleApp peut utiliser n'importe quoi dans n'importe quel SimpleApp . L'alternative serait de rompre l'encapsulation -- comment faire une bonne equals par exemple, qui ne nécessite pas l'accès aux champs d'une autre instance, sans faire de ces champs des éléments d'information. protected ou même public ou exiger des getters pour des données qui ne devraient être disponibles qu'à l'intérieur de la classe ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X