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();
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:该方法不能被覆盖。例子:
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() {
}
}
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"));
}
final
应用于变量的词意味着变量的值不能改变。这允许编译器确保仅在声明时初始化变量(在类属性的情况下,必须在声明时或在类构造函数中分配变量)。如果变量被重置,这将引发编译错误。对于原始类型的变量,这很容易理解:
对于对象类型的变量,考虑变量的值是一个引用而不是它的状态。这里有一个例子:
由于变量被声明为
final
,这可以确保编译器该变量不能更改其值。当您有一个方法的局部变量并且这些变量需要在该方法的局部类(通常称为匿名类)中使用时,这非常有用,因为该类无法将值分配给不属于该类的变量或局部变量。这里有一个例子:final
还有其他用途:声明一个类,如
final
. 这使得类无法扩展。例子:将方法声明为
final
:该方法不能被覆盖。例子:将类属性定义为:该属性在编译和运行时
static final
具有常量值。这主要用于在应用程序级别定义常量变量。例子:附加:定义在接口中的属性总是声明为
static final
,也就是说,它们是常量。有关它的更多官方信息(来自 Java 语言规范):
final
它有多种用途,在方法中指示变量不能被修改不仅很重要......正如@LuiggiMendoza 已经解释的那样,当您想在匿名类中使用这些变量之一时,它也是强制性的......前任:
现在如果你把 final 修饰符放在