Почему я могу вызвать приватный метод? - PullRequest
2 голосов
/ 09 августа 2011

Я не должен вызывать закрытый метод экземпляра объекта.Интересно, почему код ниже работает.

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");
    }
}

Я понимаю, что приватный метод доступен из класса.Но если метод внутри класса создает экземпляр объекта того же класса, разве правила области не должны применяться к этому экземпляру объекта?

Может ли статический метод, такой как main, получить доступ к нестатическому члену класса, как указанов этом примере?

Ответы [ 8 ]

11 голосов
/ 09 августа 2011

Ваш метод main является методом SimpleApp, поэтому он может вызывать приватные методы SimpleApp.

Тот факт, что метод static не мешает ему вести себя какМетод для целей public, private и т. д. private запрещает доступ только к методам других классов к методам SimpleApp.

3 голосов
/ 09 августа 2011

Поскольку main также является членом SimpleApp.

2 голосов
/ 14 апреля 2014

См. Диаграмму ниже

Модификаторы доступа

                     **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

Поскольку ваш метод находится внутри автомобиля, он доступен на основе вышеуказанного правила большого пальца.

2 голосов
/ 09 августа 2011

private означает, что «только вещи в этом классе могут возиться с этим».Это не означает «только этот экземпляр может вызывать его методы», что, по-видимому, является тем, что вы ожидаете.Любой код в SimpleApp может использовать что угодно в любом SimpleApp.В качестве альтернативы можно было бы нарушить инкапсуляцию - как бы вы, например, сделали правильный метод equals, который не требовал бы доступа к полям другого экземпляра, не делая эти поля protected или даже public или не требуя геттеры дляданные, которые должны быть доступны только внутри класса?

2 голосов
/ 09 августа 2011

Из Java Tutorial :

приватный модификатор - поле доступно только внутри его собственного класса

Метод main находится в том же классе, что и закрытый метод, и поэтому имеет к нему доступ.

0 голосов
/ 14 апреля 2014

В программе мы создали два экземпляра класса, используя которые мы вызвали два закрытых метода. Интересно видеть, что эта работа работает так, как мы привыкли вызывать публичные методы или методы по умолчанию вне его класса, используя ссылку на объект. В этом случае все это делается внутри определения класса, поэтому оно действительно. Тот же код, помещенный вне класса, приведет к ошибке.

0 голосов
/ 09 августа 2011

Вы совершаете вызов из того же класса, где находится ваш приватный метод.Это разрешеноЭто способ, которым «частный» определяется в Java.

0 голосов
/ 09 августа 2011

Поскольку область действия private ограничивает доступ к классу, определяющему метод, и ваш main оказывается в том же классе.

приватный модификатор - поле доступно только внутри его собственного класса.

См. Модификаторы доступа в документации Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...