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

执行顺序

父类静态代码块—> 子类静态代码块---------->父类构造函数-------->子类代码块--------->子类构造函数
静态代码块,只随着类的初始化,加载一次,也就是执行一次,静态代码块在加载时执行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值