方法签名
方法签名包括方法名和参数列表,是 JVM 标识方法的唯一索引。方法签名不包括返回值,更不包括范访问权限控制符、异常类型等。
值传递
无论是基本数据类型,还是引用类型,Java 中的参数传递都是值传递,即值复制的传递过程。
构造方法
构造方法拥有以下特征:
- 构造方法方法名必须和类名相同;
- 构造方法是没有返回类型的,即使 void 也不能有;
- 构造方法不能被继承,不能被 Override,不能被直接调用。调用途径有三种:一是通过 new 关键字;二是在子类的构造方法通过 super 关键字调用父类的构造方法;三是通过反射的方式获取并调用;
- 类定义时提供了默认的无参构造方法。但如果显式定义了有参构造方法,则该无参构造方法会被覆盖,如果希望有无参构造方法,则需要进行显式定义;
- 构造方法可以私有。
在接口中不能定义构造方法;在抽象类中可以定义;在枚举类中可以定义,但默认是 private 的,所以不能加任何修饰。
《阿里巴巴 Java 开发手册》强制规定:构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。因为某些序列化框架在反序列化时,仅会调用无参构造方法。
Lombok 提供了 3 个构造方法注解,包括: @NoArgsConstructor
、 @RequiredArgsConstructor
、 @AllArgsConstructor
,此外 @Data
包含了 @RequiredArgsConstructor
。
静态代码块
类中的 static{…} 代码被称为类的静态代码块,在类初始化时执行,而且优先级很高。
class Parent {
static { System.out.println("Parent static block"); }
public Parent() { System.out.println("Parent constructor method"); }
}
class Son extends Parent {
static { System.out.println("Son static block"); }
public Son() { System.out.println("Son constructor method");}
}
new Son();
new Son();
输出结果如下:
Parent static block
Son static block
Parent constructor method
Son constructor method
Parent constructor method
Son constructor method
从以上示例可以看出,在创建类对象时,会先执行父类和子类的静态代码块,然后再执行父类和子类的构造方法。另外,静态代码块只会执行一次,而构造方法在每次实例化对象时都会被执行。
final 关键字
被 final 关键字修饰的方法表示不能被子类 Override。
方法定义顺序
《阿里巴巴 Java 开发手册》推荐类内方法定义的顺序是:public / protected 方法 > private 方法 > getter / setter 方法。