用final修饰基本类型
public class Main{
public Main(int i){
this.i = 2333;
}
final int i;
}
初始化时必须对i进行赋值,且不能改变i的值
public class Main{
public Main(int i){
this.i = 2333;
🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️
this.i = 666;
🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️
}
final int i;
}
final是线程安全的
用final修饰引用类型
引用类型来说指向不变,它指向的对象是可以改变的
public class Main {
public static void main(String[] args) {
Date date = new Date();
setDate(date);
}
public static void setDate(final Date date){
date.setTime(0);
}
}
用final修饰class
这意味着这个类无法被其它类继承
public final class Base {
public void sayHello() {
System.out.println("我是父类!");
}
}
这个类是没有办法被任何类继承的
🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️
public class Sub extends Base {
public void sayHello() {
System.out.println("我是子类!");
}
}
🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️
为什么JDK要让有的类无法被继承?
因为这样可能会破坏原本安全的子类向父类的类型转换
用final修饰方法
public class Base {
public final void sayHello() {
System.out.println("我是父类!");
}
}
这个用final修饰的sayHello方法是不能被子类重写的
public class Sub extends Base {
🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️
@Override
public void sayHello() {
System.out.println("我是子类!");
}
🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️🙅♂️
}
单例模式(一个类只实例化一个对象)
- 将构造器私有化
- 用final修饰唯一的实例
public class World {
private static final World SINGLETON_INSTANCE = new World();
public static World getInstance(String[] args) {
return SINGLETON_INSTANCE;
}
private World(){
}
}