Java教程

Java Instance初始化

为什么使用Instance初始化程序块?

假设我必须在将值赋给实例数据成员时执行一些操作,例如for循环以填充复杂的数组或错误处理等。

Instance初始化程序块的示例

让我们看一下执行初始化的实例初始化程序块的简单示例。
class Bike7{
    int speed;
    Bike7(){
        System.out.println("speed is "+speed);
    }
    {
        speed=100;
    }
    public static void main(String args[]){
        Bike7 b1=new Bike7();
        Bike7 b2=new Bike7();
    }
}
Output:speed is 100 speed is 100
java中有三个可以执行操作的地方:
方法 构造函数 程序块

首先调用的是实例初始化程序块还是构造函数?

class Bike8{
    int speed;
    Bike8(){
        System.out.println("constructor is invoked");
    }
    {
        System.out.println("instance initializer block invoked");
    }
    public static void main(String args[]){
        Bike8 b1=new Bike8();
        Bike8 b2=new Bike8();
    }
}
instance initializer block invoked constructor is invoked instance initializer block invoked constructor is invoked
在上面的示例中,似乎首先调用了实例初始化程序块,但没有。创建对象时将调用实例初始化器块。 Java编译器在第一个语句super()之后将实例初始化程序块复制到构造函数中。因此,首先,调用构造函数。让我们通过下图了解它:
注意: Java编译器会在每个构造函数中复制实例初始化程序块的代码。
实例初始化程序块

实例初始化程序块的规则:

实例初始化程序块主要有三个规则。它们如下:
创建类的实例时,将创建实例初始化程序块。 实例构造器块在父类构造函数被调用之后(即在super()构造函数调用之后)被调用。 实例初始化程序块按它们出现的顺序排列。

实例初始化程序块的程序,该程序在super()之后调用

class A{
    A(){
        System.out.println("parent class constructor invoked");
    }
}
class B2 extends A{
    B2(){
        super();
        System.out.println("child class constructor invoked");
    }
    {
        System.out.println("instance initializer block is invoked");
    }
    public static void main(String args[]){
        B2 b=new B2();
    }
}
Output:parent class constructor invoked instance initializer block is invoked child class constructor invoked

实例块的另一个示例

class A{
    A(){
        System.out.println("parent class constructor invoked");
    }
}
class B3 extends A{
    B3(){
        super();
        System.out.println("child class constructor invoked");
    }
    B3(int a){
        super();
        System.out.println("child class constructor invoked "+a);
    }
    {
        System.out.println("instance initializer block is invoked");
    }
    public static void main(String args[]){
        B3 b1=new B3();
        B3 b2=new B3(10);
    }
}
parent class constructor invoked instance initializer block is invoked child class constructor invoked parent class constructor invoked instance initializer block is invoked child class constructor invoked 10
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4