Java初始化块可以分为三种类型:静态初始化块、实例初始化块、构造函数。
静态初始化块是用static关键字声明的代码块,它会在类加载时被执行,而且只会被执行一次。它可以用来对类的静态成员变量进行初始化,也可以用来执行一些特殊的任务。
static { // 静态初始化块 }
实例初始化块是用{}括起来的代码块,它会在每次创建对象时都会被执行一次。它可以用来对对象的成员变量进行初始化,也可以用来执行一些特殊的任务。
{ // 实例初始化块 }
构造函数是一种特殊的方法,它会在每次创建对象时都会被执行一次。它与实例初始化和静态分开(如有必要),并且有不同的语法格式。
public class Test { public Test() { // 构造函数 } }
实例初始化块用于初始化类的对象。
一个实例初始化程序只是一个类的代码块,但在任何方法或构造函数之外。
实例初始值设定程序没有名称。它的代码只是放置在一个开放大括号和闭包。
下面的代码展示了如何为Test类声明一个实例初始化器。
注意,实例初始化程序在实例上下文中执行,并且关键字this在实例初始化程序中可用。
class Test { private int num; // An instance initializer { this.num = 101; } }
我们可以有一个类的多个实例初始化器。对于我们创建的每个对象,它们都以文本顺序自动执行。
所有实例初始值的代码在任何构造函数之前执行。
下面的代码演示了构造函数和实例初始化函数的执行顺序。
public class Main { { System.out.println("Inside instance initializer 1."); } { System.out.println("Inside instance initializer 2."); } public Main() { System.out.println("Inside no-args constructor."); } public static void main(String[] args) { Main m = new Main(); } }
上面的代码生成以下结果。
实例初始化程序不能有return语句。
静态初始化块也称为静态初始化器。它类似于实例初始化块。
它用于初始化一个类。每个对象执行一个实例初始化器,而当类定义被加载到JVM中时,只对一个类执行一次静态初始化器。
我们需要在其声明的开头使用static关键字。
我们可以在类中有多个静态初始化器。所有静态初始化器都按文本出现的顺序执行,并在任何实例初始化器之前执行。
以下代码演示了何时执行静态初始化程序。
public class Main { private static int num; {// An instance initializer System.out.println("Inside instance initializer."); } // A static initializer. Note the use of the keyword static below. static { num = 2014; System.out.println("Inside static initializer."); } // Constructor public Main() { System.out.println("Inside constructor."); } public static void main(String[] args) { System.out.println("Inside main() #1. num: " + num); // Declare a reference variable of the class Main si; System.out.println("Inside main() #2. num: " + num); new Main(); // Create an object System.out.println("Inside main() #3. num: " + num); new Main();// Create another object } }
上面的代码生成以下结果。
静态初始化器不能抛出检查的异常,它不能有一个return语句。
Java面向对象设计 -Java Object.Equals方法以下代码显示如何实现equals()和hashCode()方法class Point {private int x;private i...
Java面向对象设计 -Java哈希码Object的哈希码哈希码是一个整数值。计算整数的算法称为散列函数。Java使用散列码从基于散列的集合...
Java面向对象设计 -Java静态内部类静态成员类不是内部类在另一个类的主体中定义的成员类可以声明为静态。例子以下代码声明了顶级...
Java面向对象设计 - Java继承子类可以从超类继承。超类也称为基类或父类。子类也称为派生类或子类。从另一个类继承一个类非常简...
Java面向对象设计 - Java抽象类和方法Java可以定义一个类,其对象不能被创建。它的目的只是表示一个想法,这是其他类的对象共有...