final关键字可用于修饰类、变量和方法,不可改变。
- final变量
- 成员变量
- 类变量:当类初始化时,系统会为类变量分配内存,并赋默认值。
- 显示赋值、静态初始化块
- 实例变量:当创建对象时,系统会为该对象的实例属性分配内存,并赋默认值。
- 显示赋值、非静态初始化块、构造方法
final修饰的类变量、实例变量能指定初始值的地方如下:
类变量:静态初始化块或声明该属性时指定初始值。
实例变量:非静态初始化块、声明该属性时或构造方法中指定初始值。
- 显示赋值、非静态初始化块、构造方法
- 类变量:当类初始化时,系统会为类变量分配内存,并赋默认值。
- 局部变量
- 形参:不能被赋值
- 定义时指定默认值,则后面代码中不能再对该变量赋值。
- 定义时没有指定默认值,则可在后面代码中对该final变量赋初始值,但只能一次。
- 在构造方法、初始化块中对final成员变量进行初始化,则不要在初始化之前就访问成员变量的值。
例5.13 final成员的使用示例。
public class Test{ final int age; { System.out.println(age);//编译出错 age=6; System.out.println(age); } public static void main(String[] args){ new Test(); } }
- final修饰基本类型和引用类型变量的区别
-
基本类型:不能对基本类型变量重新赋值。
-
引用类型:保存的是一个引用,final只保证这个引用(地址)不会改变,即一直引用同一个对象,但这个对象可以发生改变。
不能给对象赋值,可以用过对象访问
-
- 成员变量
-
final方法
-
final修饰的方法仅仅是不能被重写,并不是不能被重载。
public class TestFinalMethod{ public final void test(){} } class Sub extends TestFinalMethod{ public void test(){} }
出现编译错误
public class TestFinalMethod{ public final void test(){} public final void test(String arg){} }
正确
-
-
final类
-
final修饰的类不可有子类。
public final class FinalClass{
//类中成员
}
class Sub extends FinalClass{
}
-
演示final修饰的类不可被继承。