作用:
主要用于修饰类、方法和变量
修饰类
final修饰的类不可被继承
比如常用的String类。
修饰方法
final修饰的方法不可被重写,可以被继承
final修饰的方法可以重载
注:类的private方法会隐式地被指定为final方法
package com.cn;
public class Main {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.say();
System.out.println(teacher.say("Tom"));
}
}
class Person{
final void say(){
System.out.println("说...");
}
/**
* final修饰的方法可以重载
* final修饰的方法不可被重写,可以被继承
*/
final String say(String name){
return "Tom" + "说...";
}
public void eat(){
System.out.println("吃...");
}
/**
* private修饰的方法不可被继承
*/
private final void take(){
System.out.println("拿...");
}
}
class Teacher extends Person{
@Override
public void eat() {
System.out.println("教师吃...");
}
private final void take(){
System.out.println("教师拿...");
}
}
注意:private修饰的方法不可被继承,所以子类与父类中相同方法不是继承自父类,是属于子类自己的方法
修饰变量
修饰的是基本数据类型时,值不可改变
修饰的是引用数据类型时,本身的内容可以修改,但指向该对象或数组的地址的引用不能修改
修饰的是类变量时,必须在声明或静态初始化块中初始化值
修饰的是成员变量时,必须在声明、构造器或非静态初始化块中初始化值
修饰的是局部变量时,系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化
class Person{
/**
* 修饰的是类变量时,必须在声明或静态初始化块中初始化值
*/
final static String NAME;
/**
* 修饰的是成员变量时,必须在声明、构造器或非静态初始化块中初始化值
*/
private final int age;
static{
NAME = "S";
}
{
age = 10;
}
public void say(){
final String str;
str = "修饰的是局部变量时,必须用户主动赋值,系统不会给默认值,如果不复制,下面输出语句将报错";
System.out.println(str);
}
}
注意:static和final的区别–> static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变,final:最终的;不可改变的,static:静止的;静态的;
好处
final关键字提高了性能。JVM和Java应用都会缓存final变量。
final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
使用final关键字,JVM会对方法、变量及类进行优化。
对于不可变类,它的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销。