final
修饰变量表明该变量是不可变的,类似于如下的效果
public class FinalTest {
public static void main(String[] args) {
final int a = 10;
a = 20; // 这行会报错,提示Cannot assign a value to final variable 'a'
}
}
在实际中,经常搭配static
一起使用
public class FinalTest {
public static final double PI = 3.14;
}
静态变量不需要对象就可以使用,而且可以被全局调用,当再加上final后,它就变成了一个全局的常量。可以看成C++中的const
关键字,之后就可以再任何地方调用FinalTest.PI
使用3.14这个值。
成员变量a在声明时,未赋值的话会报错,会告诉你未初始化。但局部变量b、c、d、e、f却没有报错,所以我们可以得出结论:
final
修饰成员变量时必须赋值,而局部变量可以暂且不赋值。public class FinalTest {
public final double PI = 3.14;
public final int a; // 只有这一行报错,Variable 'a' might not have been initialized
public static void main(String[] args) {
final int b;
}
public void test1() {
final int c;
}
public static void test2() {
final int d;
}
{
final int e;
}
static {
final int f;
}
}
final
修饰局部变量如果没有初始化则不能直接使用。public class FinalTest {
public final double PI = 3.14;
public static void main(String[] args) {
final int a;
System.out.println(a); // 报错,Variable 'a' might not have been initialized
}
}
final
修饰的局部变量不能进行二次赋值public class FinalTest {
public static void main(String[] args) {
final int a;
a = 10;
a = 20; // 报错,Variable 'a' might already have been assigned to
}
}
final的不可变性是变量的指向不可变,指向的内容可以变。而String则相反,是指向可以变,但是指向的内容不可变(字符串常量池)。
String a = "a";
a = "helloWorld";
在上述代码中,变量a
首先指向了字符串"a"
,而后改变了变量a
的指向,a
指向了另一个常量"helloWorld"
,一般来说,常量"a"
仍存储在常量池中,并未改变常量"a"
的内容。
public class FinalTest {
public static void main(String[] args) {
final Money money1 = new Money(20);
final Money money2 = new Money(40);
System.out.println(money1.getValue());
money1.setValue(100);
System.out.println(money1.getValue());
money1 = money2; //报错
}
static class Money {
private int value;
public Money(){
}
public Money(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
}
在上述代码中,money1
和money2
分别指向一个Money
对象,final
修饰的变量指向的内容是可以更改,但是无法更改money1
的指向。
final
修饰,例如String
以下说法错误的是( )
A.final修饰的方法不能被重载
B.final可以修饰类、接口、抽象类、方法和属性
C.final修饰的方法也不能被重写
D.final修饰的属性是常量,不可以修改
答案:AB
首先大家要知道final的意思为最终的,然后我来给大家细讲一下
A.final修饰方法后,方法是不可被重写的,因为它已经是“最终形态”了。但不会影响重载
B.final修饰类标志此类不可被继承。如果final可以标志抽象类和接口,抽象类不能继承?接口不准实现?
那还要来什么意义,所以final不能修饰抽象类和接口
C.题目中这个也字就是来误导人的,同A一样解释过了,final修饰的方法不可重写
D.这道题不能太钻牛角尖,final确实是修饰变量,只不过被修饰过的变量不能再变了,既然变量不能再变了我们就可以把它当做常量。
解析:链接:https://www.nowcoder.com/questionTerminal/e78e3374a8a84abbb2fc49c332ed9b3e
来源:牛客网