OCA/OCP Java Note (8): Methods and Encapsulation

1. Designing Methods

1.1. Access Modifiers

  • private
  • default
  • protected
  • public

1.2. Optional Specifiers

  • static
  • abstract
  • final
  • synchronized
  • native
  • strictfp: strict float point,精确浮点,参考Wiki

  可选说明符要放在返回值类型之前。

eg. 

1.3. Return Type

  具有非void返回类型的方法,必须始终能返回对应类型。

eg. 

无法编译,因为不能保证return总被执行。

eg. 

无法编译,返回值的类型与声明不符。

2. Working with Varargs

  可变参数必须是参数列表中的最后一个元素,每个方法最多只能有一个可变参数。

eg. 

eg. 

3. Applying Access Modifiers

3.1. Calling a Static Variable or Method

  可以用类名或对象的实例来访问静态变量或方法。当使用对象的实例来访问静态成员时,编译器会检查引用的类型,并使用该类型来替代实例本身。

eg. 

3.2. Static Initialization

  静态初始化在类首次被使用时执行。

eg. 

eg. 

3.3. Static Imports

  普通的导入用于导入类, 静态导入用于导入类的静态成员,可以静态导入某个特定成员,也可以在静态导入中使用通配符。

eg. 

静态导入了 Arrays.asList 后,调用 asList() 不需要前缀 Arrays. 。

eg. 

第1行无法编译,不能使用静态导入来导入类;第3行无法编译,应使用import static;第7行无法编译,之前静态导入了asList,但没有导入Arrays。

  与普通导入类似,不能静态导入具有想用名称的静态成员。此时可以使用类名来访问静态成员,取代静态导入。

eg. 

4. Overloading Methods

4.1. Overloading and Varargs

  可变参数等用于数组参数,不能相互重载。

eg. 

两个 fly() 是等效的,重复定义无法编译。

  传入数组参数,可以调用具有可变参数或数组参数的方法;分别传入参数,只能调用具有可变参数的方法。

eg. 

4.2. Autoboxing

  Java会匹配最准确的参数列表。 如果只有:

使用 fly(3) 时Java会自动把3封装为Integer,从而调用 fly(Integer numMiles) 。如果同时有:

fly(3) 会直接调用 fly(int numMiles) 而不会发生自动封装。

  Java选择重载方法的顺序如图1所示。

 图1

图1

eg. 

Java可以自动把int 4转换为long 4或Integer 4,但不能把把int 4自动转换为Long 4。

5. Creating Constructors

5.1. Default Constructor

  如果类中没有构造器,则Java自动添加一个没有参数的默认构造器。

5.2. Overloading Constructors

  构造器必须通过在类名前加new来调用。

eg. 

  可以使用this来调用本实例的其他构造器,必须在方法的第一行使用。

eg. 

5.3. Final Fields

  可以在构造器中对final成员变量进行初始化。

5.4. Order of Initialization

  实例化类时,初始化顺序为:

  1. 如果有父类,则先初始化父类;
  2. 按顺序初始化静态变量和静态初始化器;
  3. 按顺序初始化实例变量和实例初始化器;
  4. 构造器。