final关键字,内部类

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: 从内部类引用的本地变量必须是最终变量或实际上的最终变量
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yuwotongle1018/article/details/81667038