Java初始化实例

Java初始化实例


类有三个地方可以初始化实例,当类实例被初始化后,以后每一个生成的对象都会带有初始化后的值。
三个初始化实例的地方:

  • 方法
  • 构造函数
  • 代码块
    q)初始化代码块和构造函数谁先执行
    a)示例
class Bike {
    int speed;
    
    Bike() {
        System.out.println("constructor is invoked");
    }

    {
        System.out.println("instance initializer block invoked");
    }

static{
	System.out.println("static block");                                   //最先执行,但是随着类的加载执行,类只加载一次,所以也执行一次。
}

    public static void main(String args[]) {
        Bike b1 = new Bike();
        Bike b2 = new Bike();
    }
}

输出结果

System.out.println("static block");
instance initializer block invoked
constructor is invoked
instance initializer block invoked
constructor is invoked

执行顺序:
1. 在加载类时执行一次静态初始化块(之后不再调用)。
2. 在每次初始化实例对象时:先执行非静态初始化块(但是得在父类构造函数之后执行)。
3. 再执行构造方法。

对第二条再添加个示例作为解释

package com.lch.executionOrder;

public class Parent_childClassConstructor {

	@SuppressWarnings("unused")
	public static void main(String[] args) {
		B2 b = new B2();
	}
}

class A {
    A() {
        System.out.println("parent class constructor invoked");
    }
}

class B2 extends A {
    B2() {
        //super();   任何子类会先执行父类的构造函数相当于隐藏了一条super()语句;
        System.out.println("child class constructor invoked");
    }

    {
        System.out.println("instance initializer block is invoked");
    }
}

输出结果

parent class constructor invoked
instance initializer block is invoked
child class constructor invoked

在执行代码块时会先执行父类的构造函数,而执行子类构造函数的时候都会执行父类的构造函数,因为每个子类的构造函数的第一行隐藏一个super();调用子类的构造函数时会先执行父类的构造函数
示例2:

package com.lch.executionOrder;

public class Parent_childClassConstructor {

	@SuppressWarnings("unused")
	public static void main(String[] args) {
		B2 b = new B2();
		B2 b1 = new B2();
	}
}

class A {
    A() {
        System.out.println("parent class constructor invoked");
    }

	static {
    	System.out.println("child static is invoke!!!");
    }
}

class B2 extends A {
    B2() {
        //super();   任何子类会先执行父类的构造函数相当于隐藏了一条super()语句;
        System.out.println("child class constructor invoked");
    }
    
    B2(int i){
    	//super();   任何子类会先执行父类的构造函数相当于隐藏了一条super()语句;
    	System.out.println("child class constructor B2 invoked");
    }

    {
        System.out.println("instance initializer block is invoked");
    }
	static {
    	System.out.println("child static is invoke!!!");
    }
}

输出结果

father static is invoke!!!
child static is invoke!!!
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

执行顺序
父类静态—> 子类静态------>父类静态代码块---------->父类构造函数-------->子类代码块--------->子类构造函数

猜你喜欢

转载自blog.csdn.net/weixin_43101144/article/details/84862738