Переменная, объявленная непосредственно в методе, является локальной переменной.Локальная переменная не может быть объявлена как 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
будет просто синтаксическим шумом.Язык не позволяет этого.