final使用
final
表示最终的,不可变的final
修饰的类无法被继承final
修饰的方法无法被覆盖重写final
修饰的变量一旦赋值,不可以重新赋值【不可二次赋值】final
修饰的实例变量,必须手动赋值,不可采用系统赋的默认值final
修饰的引用,一旦指向某个对象之后,不能再指向其他对象,那么被指向的对象无法被垃圾回收器回收final
修饰的引用虽然不可以再指向其他对象,但是指向的对象内部的内存是可以改变的- 常量语法格式:
public static final 类型 常量名 = 值;
1、 final
表示最终的,不可变的
2、 final
修饰的类无法被继承
final class Animal {}
//以下会报错
//class Cat extends Animal {}
3、 final
修饰的方法无法被覆盖重写
class B{
public final void m(){}
}
class C extends B{
//编译报错
//public void m(){}
}
4、final
修饰的变量一旦赋值,不可以重新赋值【不可二次赋值】
int i = 10;
i = 20;
final int k = 100;
//编译报错:无法为最终变量 k 分配值
//k = 200;
final int m;
m = 10;
//编译报错:无法为最终变量 m 分配值
//m = 20;
5、final
修饰的实例变量,必须手动赋值,不可采用系统赋的默认值
public class Test{
//编译报错
//final int i;
//第一种解决方案
final int i = 100;
//第二种解决方案
final int age;
public Test(){
this.age = 20;
}
public static void main(String[] args){
final int age;
age = 100;
//不可二次赋值
//age = 200;
}
}
6、 final
修饰的引用,一旦指向某个对象之后,不能再指向其他对象,那么被指向的对象无法被垃圾回收器回收
public class Test{
public static void main(String[] args){
//创建对象
User u1 = new User(20); // User u1 = 0x1234
//程序执行到这里表示上面的对象变成了垃圾数据,回收器回收
//这里是又创建了一个新的对象
u1 = new User(10); // u1 = 0x4567
final User u2 = new User(30);
//编译报错
//u2 = new User(50);
}
}
class User{
int age;
public User(){}
public User(age){
this.age = age;
}
}
7、 final
修饰的引用虽然不可以再指向其他对象,但是指向的对象内部的内存是可以改变的
public class Test{
public static void main(String[] args){
final User u2 = new User(30);
//编译报错
//u2 = new User(50);
//通过
u2.age = 40;
}
}
8、 因为final
修饰的数据是不可变的,所以现在引入常量的概念
常量
语法格式: public static final 类型 常量名 = 值;
常量名要求字母全部大写,单词之间用下划线连接
public class Test{
public static void main(String[] args){
System.out.println(Chinese.GUO_JI);
System.out.println(Math.PI);
}
}
class Chinese{
public static final String GUO_JI = "中国";
}
class Math{
public static final int PI = 3.1415926;
}
小结
final
表示最终的,不可变的final
修饰的类无法被继承final
修饰的方法无法被覆盖重写final
修饰的变量一旦赋值,不可以重新赋值【不可二次赋值】final
修饰的实例变量,必须手动赋值,不可采用系统赋的默认值final
修饰的引用,一旦指向某个对象之后,不能再指向其他对象,那么被指向的对象无法被垃圾回收器回收final
修饰的引用虽然不可以再指向其他对象,但是指向的对象内部的内存是可以改变的- 常量语法格式:
public static final 类型 常量名 = 值;