Могу ли я объявить частные переменные внутри открытого метода? - PullRequest
0 голосов
/ 02 июня 2018

Этот вопрос был задан мной в интервью.

Можем ли мы объявить закрытые переменные внутри публичного метода?
Если можно, можем ли мы получить доступ к переменным с помощью открытого метода?

Я пытался с помощью Java, но он не позволяет определить закрытую переменную внутри метода, почему это так?

public class GetUser {

public String getUserName(){

    private String user="David"; 

return user;

}}

Ответы [ 4 ]

0 голосов
/ 02 июня 2018

Переменная, объявленная непосредственно в методе, является локальной переменной.Локальная переменная не может быть объявлена ​​как private.Фактически, единственным модификатором, который вы можете использовать в объявлении локальной переменной, является final.

Также возможно встроить объявление внутреннего класса внутри метода;либо анонимный внутренний класс, либо именованный внутренний класс.Внутренний класс может объявлять поля, и эти поля могут иметь полный диапазон модификаторов, кроме static.В каком-то смысле поля являются переменными «внутри» включающего метода.Вот пример:

public void myMethod () {

   class Inner() {
       private int field1;
       public int field2;
       /* .... */
   }

   Inner inner = new Inner();
   // do stuff with the inner object
}

Если вы поиграете с вышеуказанным кодом, вы увидите, что код в myMethod имеет полный доступ к закрытым полям Inner.Но в любом случае, это пример объявления переменной private "внутри" метода.

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

Но единственный код, который можетдоступ к локальным переменным метода находится рядом;то есть в том же файле исходного кода и в теле метода.Предполагается, что любой код в теле может нуждаться в доступе к локальной переменной, а любой код, который не должен иметь доступа (например, чтобы избежать связывания), должен иметь другой метод.

Таким образом, «естественная» видимость локальной переменной эквивалентна private, а другие настройки видимости не имеют большого смысла.Таким образом, учитывая, что все локальные переменные являются «естественно» закрытыми, тогда явное объявление их как private будет просто синтаксическим шумом.Язык не позволяет этого.

0 голосов
/ 02 июня 2018

Нет, вы не можете.Переменные внутри метода считаются локальными и не могут иметь модификаторов.У вас могут быть личные поля в классе, но это не так:

public class Test {
    public String getUserName(){

        user="David"; 
        return user;

    }
    private String user;
}

Кроме того, называть класс GetUser довольно неудобно.Лучшее имя класса будет User.getUser больше подходит для имени метода.

0 голосов
/ 02 июня 2018

Нет, это синтаксическая ошибка, вы не можете использовать модификаторы доступа внутри метода.

Модификаторы доступа используются для определения области действия некоторых членов (атрибутов, конструкторов, методов) класса.Область действия переменной метода - только этот метод, поэтому вам не нужно явно указывать область действия.

Подробнее о модификаторах доступа: https://www.javatpoint.com/access-modifiers

0 голосов
/ 02 июня 2018
  • Вы не можете объявить любую переменную со спецификатором доступа в методе.
  • Вы можете сделать это, определив внутренний класс и объявив в нем частные переменные.
  • И да, это можетбыть доступным из этого метода.

РЕДАКТИРОВАТЬ: Подробнее о Внутренний класс здесь

...