类的初始化顺序

今天,在手机上做面试题,是有关类的初始化。

这里直接上代码:

public class test8  extends A{
	test8(){
		super("B");
		System.out.print("B");
	}
	public static void main(String[] args) {
		new test8();
	}
}
class C{
	C(){
		System.out.print("C");
	}
}
class A{
	C c = new C();
	A(){
		this("A");	
	}
	A(String s){
		System.out.print(s);
	}
}
打印结果为:CBB


上面是一个简单的例子,首先初始化类test8,这里会调用该类的无参构造方法,在无参构造方法

调用了超类中带参数的构造方法(继承了类A),而在类A中,又创建了C类的对象c,根据打印的

结果说明:c对象的创建在类A的构造函数调用之前,也就是说在调用super('B')时,会先初始化

成员变量。(这么说不知道对不对)


下面再给出一个详细的例子来说明:

public class test1 {
	public static void main(String[] args) {
		C c = new C();
	}
}

class A{
	int a = 0;
	Method m = new Method(a);
	static int a1 = 10;
	static{
		System.out.println("A:执行静态代码块A"+a1);
	}
	
	{
		System.out.println("非静态代码块A");
	}

	public A(){
		System.out.println("a:"+ a);
	}
}

class B extends A{
	int b = 1;
	Method m = new Method(b);
	static int b1 = 20;
	static{
		System.out.println("B:执行静态代码块B"+b1);
	}
	
	{
		System.out.println("非静态代码块B");
	}
	
	public B(){
		System.out.println("b:"+ b);
	}
}

class C extends B{
	int c = 2;
	Method m = new Method(c);
	static int c1 = 30;
	static{
		System.out.println("C:执行静态代码块C"+c1);
	}
	
	{
		System.out.println("非静态代码块C");
	}
	
	public C(){
		System.out.println("c:"+ c);
	}
}

class Method{
	public Method(int i){
		System.out.println("打印数据:" + i);
	}
}
打印结果为:


这里分析一下:在主函数创建类C的对象并初始化的过程:

1、C类继承B类、B类继承A类,A是B的父类,B是C的父类;

2、调用A类的静态代码块和静态变量,打印“A:执行静态代码块A10”

3、调用B类的静态代码块和静态变量,打印"B:执行静态代码块B20"

4、调用C类的静态代码块和静态变量,打印"C:执行静态代码块C30"

5、调用A类的普通成员变量和代码块,再调用A类的构造方法

6、调用B类的普通成员变量和代码块,再调用B类的构造方法

7、调用C类的普通成员变量和代码块,再调用C类的构造方法,打印完毕


这里我们可以看出类的初始化过程,首先按照顺序初始化父类中的静态变量和静态代码块,然后

初始化子类中的静态变量和静态代码块,再就是初始化父类中的普通成员变量和代码块,再调用

父类的构造方法,最后初始子类中的普通成员变量和代码块,再调用子类的构造方法。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值