方法签名

方法签名包括方法名和参数列表,是 JVM 标识方法的唯一索引。方法签名不包括返回值,更不包括范访问权限控制符、异常类型等。

值传递

无论是基本数据类型,还是引用类型,Java 中的参数传递都是值传递,即值复制的传递过程。

构造方法

构造方法拥有以下特征:

  • 构造方法方法名必须和类名相同;
  • 构造方法是没有返回类型的,即使 void 也不能有;
  • 构造方法不能被继承,不能被 Override,不能被直接调用。调用途径有三种:一是通过 new 关键字;二是在子类的构造方法通过 super 关键字调用父类的构造方法;三是通过反射的方式获取并调用;
  • 类定义时提供了默认的无参构造方法。但如果显式定义了有参构造方法,则该无参构造方法会被覆盖,如果希望有无参构造方法,则需要进行显式定义;
  • 构造方法可以私有。

接口中不能定义构造方法;在抽象类中可以定义;在枚举类中可以定义,但默认是 private 的,所以不能加任何修饰。

《阿里巴巴 Java 开发手册》强制规定:构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。因为某些序列化框架在反序列化时,仅会调用无参构造方法。

Lombok 提供了 3 个构造方法注解,包括: @NoArgsConstructor@RequiredArgsConstructor@AllArgsConstructor ,此外 @Data 包含了 @RequiredArgsConstructor

静态代码块

类中的 static{…} 代码被称为类的静态代码块,在类初始化时执行,而且优先级很高。

  1. class Parent {
  2. static { System.out.println("Parent static block"); }
  3. public Parent() { System.out.println("Parent constructor method"); }
  4. }
  5. class Son extends Parent {
  6. static { System.out.println("Son static block"); }
  7. public Son() { System.out.println("Son constructor method");}
  8. }
  1. new Son();
  2. new Son();

输出结果如下:

  1. Parent static block
  2. Son static block
  3. Parent constructor method
  4. Son constructor method
  5. Parent constructor method
  6. Son constructor method

从以上示例可以看出,在创建类对象时,会先执行父类和子类的静态代码块,然后再执行父类和子类的构造方法。另外,静态代码块只会执行一次,而构造方法在每次实例化对象时都会被执行。

final 关键字

被 final 关键字修饰的方法表示不能被子类 Override。

方法定义顺序

《阿里巴巴 Java 开发手册》推荐类内方法定义的顺序是:public / protected 方法 > private 方法 > getter / setter 方法。