Почему Java позволяет использование “конца” внутри методов и функций?

Он смотрел один из вопросов и я появилось сомнение, которое говорит титул.

Почему позволено ключевое слово final внутри методов и функций?

3
задан 13.04.2017, 16:00
2 ответа

Слово final примененная к переменным значь, что стоимость переменной не может быть измененной. Это позволяет составителю уверять, что переменная только инициализируется в Вашем заявлении (в случае признаков класса, переменная должна быть распределенной, высказавшись или в строителе класса). В случае, что переменная была повторно включена, это бросит ошибку компиляции.

Для переменных примитивного типа, это простое понимания:

final int i = 5;
i = 7; //error de compilación aquí

Для переменных типа объекта, нужно считать, что стоимость переменной - ссылка и не Ваше состояние. Здесь пример:

public class MiEntidad {
    int id;
    String nombre;
}

//asignando una referencia como valor a la variable
final MiEntidad miEntidad = new MiEntidad();
//aquí se modifica el estado interno de dicha referencia
//pero la referencia mantiene su mismo valor
miEntidad.id = 1; //esto cambia el estado de l
miEntidad.nombre = "Luiggi";
//aquí se intenta asignar una nueva referencia a la variable
//por ende, ocurre un error de compilación
miEntidad = new MiEntidad();

Так как переменная высказывается как final, это гарантирует составителя, что переменная не смогла менять Вашу стоимость. Это очень полезное, когда имеются локальные переменные по отношению к методу и эти нуждаются в том, чтобы использоваться внутри локального класса в метод (обычно названный анонимные классы), так как этот класс не может распределять стоимость в переменные, которые не принадлежат ни классу ни локальным переменным. Здесь пример:

public void metodoX() {
    //si remueves la palabra final, saldrá un error de compilación
    //en la clase interna
    final int tope = 10;
    Thread t = new Thread( () -> {
        //esta es una clase interna local al método metodoX
        //que implementa la interfaz Runnable
        //y hace uso de la variable externa "tope"
        //puesto que "tope" es ajena a la clase interna y
        //no pertenece a la clase donde se encuentra metodoX
        //la variable necesita ser declarada como final
        for (int i = 1; i <= tope; i++) {
            System.out.println(String.format("Hola %d", i));
        }
    });
    t.start();
}

final у него есть другие использования:

  • Объявлять класс как final. Это способствует тому, чтобы класс не смог быть распространенным. Пример:

    public final class NoMeHereden {
    }
    
    //error de compilación
    //puesto que la clase NoMeHereden está declarada como final
    public class YoQuieroHeredarDe extends NoMeHereden {
    }
    
  • Объявлять метод как final: Метод не может быть на сочинении (overridden). Пример:

    public class HeredenDeMi {
        public final void peroNoSobreescribanEsto() {
        }
    }
    
    public class YoHeredoDe extends HeredenDeMi {
        //error de compilación
        //el método está declarado como final
        //no puede ser sobreescrito
        @Override
        public void peroNoSobreescribanEsto() {
        }
    }
    
  • Определять признак класса как static final: Признак обладает постоянной стоимостью во времени компиляции и выполнения. Это используется для того, чтобы определять главным образом постоянные переменные на уровне приложения. Пример:

    public class MisConstantes {
        public static final int CERO = 0;
        public static final String DELIMITADOR_BASE = "_";
        //como es una constante, se debe asegurar que la variable
        //y su estado no puedan ser modificados en tiempo de
        //compilación
        public static final List<String> EXTENSIONES_ACEPTADAS =
            Collections.unmodifiableList(Arrays.asList("txt", "pdf", "csv"));
    }
    

Добавочный: признаки, определенные в интерфейсе всегда объявлены как static finalа именно, они постоянные.

Больше официальной информации (спецификации языка Java) по этому поводу:

6
ответ дан 24.11.2019, 14:24
  • 1
    Тогда, внутри м и # 233; все и функции act и # 250; в равного способа, нет? Я имею в виду, что определяет локальную переменную со стоимостью и этот не может быть измененным, что-то схвати и # 237; как один readonly в C #? – NaCl 13.05.2016, 23:21
  • 2
    Правильный, он сходный с readonly C #. В Java, у final есть м и # 225; s функциональность. –  13.05.2016, 23:21
  • 3
    Тогда, и #191; final не является одиноким sealed в C #? – NaCl 13.05.2016, 23:22
  • 4
    Нет, он это не. Ваше поведение слегка отличное. Завись, если ты это используешь в переменной, в одном м и # 233; совсем или в классе –  13.05.2016, 23:22
  • 5
    Podr и # 237; чтобы быть и #250; til включать ее (s) ты снабжаешь ссылками (s) в Java Лангвахе Спесификатион , где определяет использование final. – Paul Vargas 14.05.2016, 02:19

У final есть несколько использований, внутри них mГ©todos не только это важно, чтобы показывать, что переменная не может быть измененной..., как уже я объясняю, что @LuiggiMendoza, tambiГ©n - обязательные , когда ты хочешь использовать одну из этих переменных в классе anГіnima.

ej:

int variable = 3;

Thread t = new Thread() { // clase anonima
    public void run() {
        System.out.println(variable); // <-- error de compilacion
    }
};   
t.start(); 

Сейчас, если ты помещаешь конечный модификатор на

final int variable = 3;

Thread t = new Thread() { // clase anonima
    public void run() {
        System.out.println(variable); // OK
    }
};   
t.start(); 
3
ответ дан 24.11.2019, 14:24