Java final关键字与单例模式

用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("我是子类!");
    }
🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️🙅‍♂️
}

单例模式(一个类只实例化一个对象)

  1. 将构造器私有化
  2. 用final修饰唯一的实例
public class World {
    private static final World SINGLETON_INSTANCE = new World();
    public static World getInstance(String[] args) {
        return SINGLETON_INSTANCE;
    }
    private World(){

    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容