Java细碎知识小结(1)
单例模式
将构造器声明为
private
, 并提供一个public
的get函数来获得单例
- 饿汉式, 在类加载的时候就直接创建好单例, 可能会浪费内存, 但是不会出现线程问题
- 懒汉式, 只有被使用的时候才会创建, 使用
if
判断一下, 不会浪费内存, 但是可能出现
线程问题而new
多个单例
final关键字
使得被修饰的类/方法/变量 无法被"修改"
- 如果不是静态, 可以在创建/代码块/构造器中任选其一赋值, 但是只能赋值一次
- 如果是静态, 只能在创建/静态代码块中赋值, 只能赋值一次
- final类不能被继承, 但是可以实例化
- final不能修饰构造器
- final和static搭配有神奇效果!, 底层编译器做了优化处理, 使得调用静态final成员的时候类
不必加载!
抽象类
一种修饰类和方法的关键字
abstract class E {
public abstract void hi();
}
- 无法创建实例对象
- 抽象类还是类, 可以有非抽象方法, 构造器, 静态属性等等
- 如果有抽象方法, 必须为抽象类
- 不能修饰属性和其他的
- 其子类有两种选择, ①也成为抽象类 ②实现抽象父类的所有抽象方法
- 抽象方法不能使用
private
,final
,static
修饰, 因为和必须重写矛盾
抽象模板设计模式
利用抽象类设计一个父类, 提供共有的方法, 由于抽象的特性, 具有较高的自由度
public abstract class Template {
public abstract void job(); // 抽象方法, 由子类重写
public void calculateTime() { // 统一的一个方法, 计算时间
long start = System.currentTimeMillis();
job();
long end = System.currentTimeMillis();
System.out.println("执行时间为: " + (end - start));
}
}
public class BB extends Template {
@Override
public void job() {
long res = 0;
for (int i = 0; i < 1E5; i++) {
res += i;
}
System.out.println(res);
}
}
public class AA extends Template {
@Override
public void job() {
long res = 0;
for (int i = 1; i <= 1E7; i++) {
res += i;
}
System.out.println(res);
}
}
利用抽象类来实现模板操作, 提高了代码的复用性
枚举类
是一组常量的集合, 属于一种特殊的类, 只包含一组有限的特定对象
- 自定义枚举类实现, 有一种设置多个"单例"的感觉, 饿汉plus
- 构造器私有化
- 去掉setxxx()方法
- 在类内部直接创建固定的对象, 可以加入final优化一下
- 使用
enum
枚举类
enum Season {
SPRING("春天", "温暖"), WINTER("冬天", "寒冷"); // 放在行首
private String name;
private String desc;
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
- 使用
enum
枚举类的时候, 实质上是继承了Enum类, 而且是一个final类 - 枚举对象必须放在枚举类的行首
- 枚举类的一些方法
- name() 输出名称
- ordinal(), 输出该枚举对象的次序
- values() 返回定义的所有枚举对象, 返回的是一个对象数组
- valueOf() 将字符串转为枚举对象, 必须是已经有的枚举对象
- 枚举对象1.compareTo(枚举对象2), 将两个对象的编号比较, 返回的是1的order 减去 2的order
注解
也被成为元数据, 用于修饰解释包, 类, 方法, 属性, 构造器, 局部变量等数据信息
- @Override 重写方法
- @Deprecated: 表示已过时
- @SuppressWarnings: 抑制编译器警告