final 关键字修饰局部变量时:
下面哪种情况会报错?
package test01;
public class Demo01 {
public static void main(String[] args) {
第一种:
final int c=0;
for (int i = 0; i < 5; i++) {
c=i;
System.out.println(c);
}
第二种:
for (int i = 0; i <5 ; i++) {
final int c=i;
System.out.println(c);
}
}
}
第一种会报错,因为第一种for循环之前已经定义 final 变量 c: 然后循环给 c 赋值,会编译报错
第二种每次都有一个新的最终变量 c ,所以不会报错;
final 修饰成员变量:
final 修饰成员变量涉及到初始化的问题:只能二选一:
显示初始化:
package test01;
public class Person {
final String NAME="yuxin"; //如果不赋值,会报错;
private int age;
}
构造函数初始化:
package test01;
public class Person {
final String NAME; //被 final 修饰的成员变量没有默认值;必须通过显示初始化或构造函数初始化
private int age; // 被 final 修饰的成员变量没有默认值,但是可以赋值为 null;
Person (String name){
this.NAME=name;
}
Person(String name, int age){
this.NAME=name;
this.age=age;
}
Person(){
this.NAME="HAHA"; //所有构造函数都要对 final 修饰的成员变量初始化
}
}
局部内部类的 fianl 问题:
局部内部类访问外部方法的局部变量有什么要求?
必须被final修饰或者需要保证该变量只赋值一次,jdk 7及以前,必须写 final
原因:堆中的生命周期比栈内存的生命周期长;
package test01;
public class Demo01 {
public static void main(String[] args) {
int num =5;
num=6;
class MethodInnerClass{
public void show(){
System.out.println(num+1); // 编译报错;Error:(10, 36) java: 从内部类引用的本地变量必须是最终变量或实际上的最终变量
}
}
}
}