javaSE_8系列博客——Java语言的特性(三)--类和对象(14)--初始化字段
2017-05-12 19:32
621 查看
如您所见,您通常可以在其声明中为字段提供初始值:
当初始化值可用并且初始化可以放在一行时,这很好。然而,这种初始化形式由于其简单性而具有局限性。如果初始化需要一些逻辑(例如,错误处理或for循环来填充复杂数组),则简单分配是不够的。实例变量可以在构造函数中初始化,其中可以使用错误处理或其他逻辑。为了提供类变量的相同功能,Java编程语言包括静态初始化块。
注意:
一个类可以有任意数量的静态初始化块,它们可以出现在类体中的任何位置。运行时系统保证静态初始化块按照它们在源代码中出现的顺序进行调用。
静态块有一个替代方法 - 你可以编写一个私有静态方法:
私有静态方法的优点是,如果需要重新初始化类变量,它们可以稍后重用。
Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可以用于在多个构造函数之间共享一个代码块。 最后一个方法不能被覆盖在一个子类中。这将在接口和继承的课程中讨论。以下是使用final方法初始化实例变量的示例:
如果子类可能需要重新使用初始化方法,这是非常有用的。该方法是被final修饰的,因为在实例初始化期间调用非final方法可能会导致问题。
public class BedAndBreakfast { // initialize to 10 public static int capacity = 10; // initialize to false private boolean full = false; }
当初始化值可用并且初始化可以放在一行时,这很好。然而,这种初始化形式由于其简单性而具有局限性。如果初始化需要一些逻辑(例如,错误处理或for循环来填充复杂数组),则简单分配是不够的。实例变量可以在构造函数中初始化,其中可以使用错误处理或其他逻辑。为了提供类变量的相同功能,Java编程语言包括静态初始化块。
注意:
尽管这是最常见的做法,但不必在类定义的开头声明字段。只需要在使用它们之前,对它们进行声明和初始化。
静态初始化块
静态初始化块是大括号{}中包含的正常代码块,static关键字在大括号的前面。以下是一个例子:static { // whatever code is needed for initialization goes here }
一个类可以有任意数量的静态初始化块,它们可以出现在类体中的任何位置。运行时系统保证静态初始化块按照它们在源代码中出现的顺序进行调用。
静态块有一个替代方法 - 你可以编写一个私有静态方法:
class Whatever { public static varType myVar = initializeClassVariable(); private static varType initializeClassVariable() { // initialization code goes here } }
私有静态方法的优点是,如果需要重新初始化类变量,它们可以稍后重用。
初始化实例成员
通常,您将使用代码来初始化构造函数中的实例变量。使用构造函数来初始化实例变量有两种方法:initializer块和final方法。 实例变量的初始化程序块看起来像静态初始化程序块,但没有static关键字:{ // whatever code is needed for initialization goes here }
Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可以用于在多个构造函数之间共享一个代码块。 最后一个方法不能被覆盖在一个子类中。这将在接口和继承的课程中讨论。以下是使用final方法初始化实例变量的示例:
class Whatever { private varType myVar = initializeInstanceVariable(); protected final varType initializeInstanceVariable() { // initialization code goes here } }
如果子类可能需要重新使用初始化方法,这是非常有用的。该方法是被final修饰的,因为在实例初始化期间调用非final方法可能会导致问题。
相关文章推荐
- javaSE_8系列博客——Java语言的特性(三)--类和对象(13)--理解类的成员
- javaSE_8系列博客——Java语言的特性(三)--类和对象(18)--嵌套类(匿名类)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(21)--何时使用Lambda 表达式?
- javaSE_8系列博客——Java语言的特性(三)--类和对象(7)--给方法或者构造器传输信息
- javaSE_8系列博客——Java语言的特性(三)--类和对象(3)--类的声明
- javaSE_8系列博客——Java语言的特性(三)--类和对象(15)--嵌套类
- javaSE_8系列博客——Java语言的特性(三)--类和对象(6)--为你的类提供构造函数
- javaSE_8系列博客——Java语言的特性(三)--类和对象(9)--对象的创建
- javaSE_8系列博客——Java语言的特性(一)--关于面向对象基本概念的理解(2)--对象
- javaSE_8系列博客——Java语言的特性(三)--类和对象(19)--嵌套类(Lambda 表达式)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(1)--概述
- javaSE_8系列博客——Java语言的特性(三)--类和对象(12)--使用this关键字
- javaSE_8系列博客——Java语言的特性(三)--类和对象(17)--嵌套类(本地/局部类)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(20)--嵌套类(Lambda 表达式--VS--方法引用)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(10)--对象的使用
- javaSE_8系列博客——Java语言的特性(三)--类和对象(5)--定义方法
- javaSE_8系列博客——Java语言的特性(三)--类和对象(11)--从方法返回值
- javaSE_8系列博客——Java语言的特性(三)--类和对象(8)--对象
- javaSE_8系列博客——Java语言的特性(一)--关于面向对象基本概念的理解(1)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(12)--类成员的访问控制