JavaSE基础语法:特殊类(特殊情景下的设计模式)
一、单例设计模式1.作用确保某个类只能创建一个对象避免浪费内存产生无效的资源占用2.写法/实现步骤eg1——饿汉式单例预制拿对象时对象已经提前创建好把类的构造器私有化定义一个类变量记住类的一个对象定义一个类方法返回对象public class A{ //2.定义一个类变量记住类的一个对象 private static(final) A anew A(); //1.私有化构造器 private A(){} //3.定义一个 类对象返回方法 public static A getObject(){return a;} }eg2——懒汉式单例用才创建需要用对象时才开始创建私有构造器定义静态变量用于存储对象提供静态方法保证返回的是同一个对象public class A{ //2.定义一个类变量记住类的一个对象 private static(final) A a;//null //1.私有化构造器 private A(){} //3.定义一个 类对象返回方法 public static A getObject(){ if(anull){anew A();} return a; } }二、枚举类enum1.作用做信息分类和标志限制传入参数范围实现类型安全普通常量只是数值编译器无法校验传入的值是否合法枚举可以统一管理一组固定有限的常量可读性更强2.写法枚举类第一行只能写枚举类的对象名称且要用逗号隔开这些名称本质是常量每个常量static final都记住了枚举类的一个对象修饰符 enum 枚举类名{ 名称1,名称2,名称3; // 分号如果后面有成员变量、构造、方法分号不能省略 其他成员... }3.特点图注右侧是反编译的代码枚举类都是最终类不可以被继承枚举类都是继承java.lang.Enum类的所以也不能继承其他类枚举类的第一行只能罗列一些名称这些名称是常量并且每个常量会记住枚举类的一个对象枚举类的构造器都是私有的写不写都只能是私有的因此枚举类对外不能创建对象编译器会为枚举类增添几个方法比如 name()名字ordinal()索引/位置三、抽象类abstract1.作用作为特殊的父类让子类继承并实现即为了更好地支持多态非必须优化需要但是需要注意的是一个类继承抽象类之后必须要重写继承的所有抽象方法否则这个类也必须要定义成抽象类2.写法修饰符 abstract class 类名{ 修饰符 abstract 返回值类型 方法名称(形参列表); //抽象方法只能abstract修饰只有方法签名没有方法体 }抽象类中不一定要有抽象方法但有抽象方法的一定是抽象类类有的成员成员变量、方法、构造器、抽象类都可以有只不过多了一个可以有抽象方法缺抽象类不能够创建对象进作为一个特殊的父类让子类继承并实现3.应用场景最佳实践当所有子类都需要这个功能但是每个子类用法都不一样时便可以使用抽象方法虽然空方法也可以但是抽象方法更符合最佳实践的思想更简洁更高级模板方法设计模式简单来说就是提供了一个方法作为某类功能的模板模板方法封装了每个实现步骤但允许子类提供特定步骤的实现这样可以提高代码的复用、并简化子类的设计这里其实可以为write方法加上final关键字防止子类更改模板方法注意不可以添加static关键字因为静态方法并不支持多态已知静态方法想要调用常态方法需要通过对象但抽象类没有对象所以会发生编译错误四、接口1. 作用定义行为规范标准对外暴露能力实现多实现弥补 Java 类单继承的局限用于解耦面向接口编程2. 基础写法修饰符 interface 接口名{ //抽象方法JDK8之前唯一成员 public abstract void run(); }类实现接口使用关键字implementspublic class Student implements 接口名{ //必须重写所有抽象方法 Override public void run(){} }3. 核心特点接口不能创建对象JDK8 版本划分JDK7 及以前接口只能有全局常量、抽象方法常量默认public static final可以省略抽象方法默认public abstract可以省略JDK8 新增默认方法 (default)、静态方法 (static)JDK9 新增私有方法 private一个类可以同时实现多个接口class A implements B,C{}接口与接口之间可以使用extends继承支持多继承interface A extends B,C{}接口没有构造器4. 重要规则普通类实现接口必须重写接口全部抽象方法 抽象类实现接口可以不重写抽象方法交给子类完成。5. 抽象类和接口的区别抽象类用class单继承可以有实例变量、构造器侧重模板、公共代码复用接口用interface多实现只能定义常量侧重行为规范、能力标准6. 拓展接口① 默认方法 defaultJDK8作用接口升级时不用强迫所有实现类重写新增方法 只能通过实现类对象调用子类可以选择重写。default void test(){}② 静态方法 staticJDK8只能通过 接口名。方法名 () 调用实现类对象不能继承、不能调用。static void test(){}③ 私有方法 privateJDK9供接口内部的默认方法互相调用外部无法访问