这篇文章写了这个知识点的具体应用:怎么声明一个不可被继承的类?这个类的应用场景?
2.修饰方法:表示方法不可被子类重写,但可以重载 3.修饰变量:表示一旦被赋值就无法更改它的值 (1)修饰成员变量如果final修饰的时类变量(静态变量),只能在静态代码块或声明时赋初始值。
//静态代码块赋值
public class Test3 {
public static final int a;
static {
a=10;
}
}
//声明时赋值
class Test4{
public static final int a=10;
}
如果修饰的是成员变量,可以在非静态代码块,构造器或者声明的时候赋初值。
//声明时赋值
public class Test5 {
public final int b=10;
}
//非静态代码块赋值
class Test6{
public final int b;
{
b=10;
}
}
//构造器赋值
class Test7{
public final int b;
public Test7(){
b=10;
}
}
(2)修饰局部变量,可以在声明时赋值,也可以后面再使用之前赋值(但只能赋值一次)
public class Test9 {
public void func(){
final int a=10;
//a=20; 会报错
final int b;
b=20;
// b=30; 会报错
}
}
(3)修饰基本类型和引用类型的区别
修饰基本类型时,基本类型的值不能变;修饰引用类型时,引用的对象不能发送改变,但对象的值可以发生改变
public class Test10 {
public static void main(String[] args) {
final int a=10;
// a=20; 会报错,基本类型的值不能改变
final int[] arr={1,2,3};
// arr={2,3,4}; 会报错,引用的对象不能改变
arr[0]=2; //对象的值可以改变
}
}
4.局部内部类为什么只能访问被final修饰的局部变量?
public class OutClass {
public int k=10;
public void func1( final int a) {
final int b=10;
//局部内部类
class InClass {
public void func() {
System.out.println(a);
System.out.println(b);
System.out.println(k);
}
}
}
}
如上述代码,两个类(外部类和内部类)其实是同一级别的,都会生成一个.class文件。当外部类被销毁时,外部类的局部变量也会被销毁,但是局部内部类是不一定被销毁的,它还在使用这外部类的变量(如a)。为了解决这个问题,就将外部类的局部变量,复制成为内部类的成员变量,哪怕外部类被销毁了,内部类也可以正常使用这些变量。但又有了一个新的问题,当内部类中的成员变量被改变时,外部类的局部变量是感知不到的,但又要让它们俩相等,怎么办?那就是强制局部变量被final修饰,复制到内部类以后值也不能被修改。(注意:其实上面代码把final去掉也不会报错,因为在java1.8以后会隐式的将被局部内部类访问的变量用final修饰,不信的话你可以在局部内部类中给该变量重新赋值,会报关于final的错误的)



