Java细碎知识小结(1)

单例模式

将构造器声明为private, 并提供一个public 的get函数来获得单例

  1. 饿汉式, 在类加载的时候就直接创建好单例, 可能会浪费内存, 但是不会出现线程问题
  2. 懒汉式, 只有被使用的时候才会创建, 使用if判断一下, 不会浪费内存, 但是可能出现
    线程问题而new 多个单例

final关键字

使得被修饰的类/方法/变量 无法被"修改"

  1. 如果不是静态, 可以在创建/代码块/构造器中任选其一赋值, 但是只能赋值一次
  2. 如果是静态, 只能在创建/静态代码块中赋值, 只能赋值一次
  3. final类不能被继承, 但是可以实例化
  4. final不能修饰构造器
  5. final和static搭配有神奇效果!, 底层编译器做了优化处理, 使得调用静态final成员的时候类
    不必加载!

抽象类

一种修饰类和方法的关键字

abstract class E {
    public abstract void hi();
}
  1. 无法创建实例对象
  2. 抽象类还是类, 可以有非抽象方法, 构造器, 静态属性等等
  3. 如果有抽象方法, 必须为抽象类
  4. 不能修饰属性和其他的
  5. 其子类有两种选择, ①也成为抽象类 ②实现抽象父类的所有抽象方法
  6. 抽象方法不能使用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);
    }
}

利用抽象类来实现模板操作, 提高了代码的复用性

枚举类

是一组常量的集合, 属于一种特殊的类, 只包含一组有限的特定对象

  1. 自定义枚举类实现, 有一种设置多个"单例"的感觉, 饿汉plus
  1. 构造器私有化
  2. 去掉setxxx()方法
  3. 在类内部直接创建固定的对象, 可以加入final优化一下
  1. 使用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;
    }
}
  1. 使用enum枚举类的时候, 实质上是继承了Enum类, 而且是一个final类
  2. 枚举对象必须放在枚举类的行首
  3. 枚举类的一些方法
  1. name() 输出名称
  2. ordinal(), 输出该枚举对象的次序
  3. values() 返回定义的所有枚举对象, 返回的是一个对象数组
  4. valueOf() 将字符串转为枚举对象, 必须是已经有的枚举对象
  5. 枚举对象1.compareTo(枚举对象2), 将两个对象的编号比较, 返回的是1的order 减去 2的order

注解

也被成为元数据, 用于修饰解释包, 类, 方法, 属性, 构造器, 局部变量等数据信息

  1. @Override 重写方法
  2. @Deprecated: 表示已过时
  3. @SuppressWarnings: 抑制编译器警告
posted @ 2023-11-09 21:15  Xingon2356  阅读(14)  评论(0编辑  收藏  举报