Skip to content

多态

多态的设计目的是通过子类的方法重写改变相应子类的行为,但是对外是一个统一的调用方法名称,以此实现了在运行时根据对象所属的子类确定对象调用方法的相应行为,但不需要修改或者复杂化父类调用逻辑,方便了功能的扩展。

抽象类

当一个父类的方法存在完全是为了让子类去覆写它,此时应当用 abstract 来修饰,由于抽象方法没有执行语句,因此不能被实例化,所以该类也应当是一个抽象类。类似于一个接口,要求子类去实现抽象类。

引用高层类型

抽象相当于调用者和底层实现之间的中间层,调用者无需关注底层实现,显而易见可以保证修改底层逻辑不容易影响到上层代码。

接口

如果一个抽象类没有成员变量,所有方法全部都是抽象方法,那么可以称之为接口,由 interface 定义。 实现接口的类应当用 implements,一个类可以实现多个接口。 可以使用 extend 让接口继承一个接口,即扩展上一个接口的方法。

面向接口编程

在使用的时候,实例化的对象永远只能是某个具体的子类,但总是通过接口去引用它,因为接口比抽象类更抽象。

java
List list = new ArrayList();

代码解耦 “解耦”意味着让代码的不同部分独立工作,避免相互依赖。通过在具体逻辑的上层抽象出一个接口,相应的对象的行为只取决于实例化的实现了接口的类型,而不需要再显式指定具体的实现了接口的类型。

静态字段和静态方法

所有类都共享的一个东西,可以通过类名来访问。因为静态方法不属于实例,因此不能使用 this。 静态方法经常用于工具类。例如:

  • Arrays.sort()
  • Math.random() 接口虽然不能有成员变量,但是可以有静态字段,编译器会自动加上 public static final

访问修饰最佳实践

如果不确定是否需要public,就不声明为public,即尽可能少地暴露对外的字段和方法。 把方法定义为package权限有助于测试,因为测试类和被测试类只要位于同一个package,测试代码就可以访问被测试类的package权限方法。 一个 .java 文件只能包含一个 public 类,但可以包含多个非 public 类。如果有 public 类,文件名必须和 public 类的名字相同。

打包与分发

  • CLASS 文件:最基础的编译产物,包含 Java 字节码,每个类文件独立存在。
  • JAR 文件(Java ARchive):这是最常见的 Java 打包格式,可以将多个 .class 文件和资源文件(如配置文件、图像等)打包在一起,并可以指定一个清单文件(MANIFEST.MF)来描述元数据。常用于发布库和应用。
  • JMOD 文件:主要用于 Java 9 及以后的模块化系统中,用来包含 .class 文件、资源文件和原生库等,适合分发和打包 JDK 或 JRE 中的模块,但不能直接执行。