final
关键字可以用来修饰类
,属性
,方法
,局部变量
,形参
final
修饰类
final class Person { }
final
修饰的类,不能被继承,可以实例化
public class Test { public static void main(String[] args) { } } final class Person { } class Student extends Person{ }
上面的代码,会运行异常:java: 无法从最终Person进行继承
final
修饰方法
,不能修饰构造方法
class Person { final public String work() { return "工作"; } }
final
修饰的方法,无法被子类重写(override),可以被继承
class Person { final public String work() { return "工作"; } } class Student extends Person{ public String work() { return "学习"; } }
上面的代码,会运行异常:java: Student中的work()无法覆盖Person中的work() 被覆盖的方法为final
final
修饰属性
final
修饰的属性又称为常量,一般用XX_XX_XX来进行命名
final
修饰的普通属性在定义时,必须赋予初始值
直接赋值
class Person { final public double PI = 3.14; }
构造器
class Person { final public double PI; public Person(double pi) { this.PI = pi; } }
代码块
class Person { final public double PI; { PI = 3.14; } }
final
修饰的静态属性在定义时,必须赋予初始值
直接赋值
class Person { final static public double PI = 3.14; }
静态代码块
class Person { final static public double PI; static { PI = 3.14; } }
final
修饰的基本类型变量,变量不可改变
final
修饰的引用类型变量,引用本身不可改变,被引用的值可以被修改
class Student{ private String name; public Student(String name) { this.name = name; } public void setName(String name) { this.name = name; } @Override public String toString() { return this.name; } } class Person { final Student student = new Student("smile"); public void run() { System.out.println("初始值" + student); student.setName("易文杰"); System.out.println("修改后的值" + student); } }
上面代码,会输出初始值smile 修改后的值易文杰
表示:引用类型变量,引用本身不可改变,被引用的值可以被修改
class Person { final public int age = 20; Person(int age) { this.age = age; } }
上面代码,会运行异常Cannot assign a value to final variable 'age'
final
修饰内部类
class Person { public void run() { final int AGE = 20; final String NAME; NAME = "smile"; } }
final
修饰形参
class Person { public String work(final String work) { work = "打工"; return work; } }
上面的代码会报错:Cannot assign a value to final variable 'work'
final
和static
一起搭配使用。
public class Test { public static void main(String[] args) { System.out.println(Status.SUCCESS); } } class Status { final static public int SUCCESS = 200; static { System.out.println("类被加载"); } }
上面的代码中,当我们直接使用final 修饰的静态属性的时候,不会导致类被加载。输出如下:200