对象的初始化全过程


/*
*初始化全过程:
*
*1, 第一次创建MyClass类的对象,或者第一次访问MyClass的static方法或字段时,Java解释器会搜寻classpath,找到MyClass.class。
*2, 装载MyClass.class后,会对所有的static数据进行初始化。这样第一个装载Class对象的时候,会先进行static成员的初始化。
*3, 使用new MyClass()创建新对象的时候,MyClass对象的构建进程会先在堆里为对象分配足够的内存。 *
*4, 清零这块新内存,把MyClass对象的primitive类型的成员赋上缺省值。
*5, 执行定义成员数据时所作的初始化。
*6, 执行构造函数。
*/
import static net.mindview.util.Print.*;

public class Beetle extends Insect
{
private int k = printInit("Beetle.k initialized");

public Beetle()
{
print("k = " + k);
print("j = " + j);
}
private static int x2 = printInit("static Beetle.x2 initialized");

public static void main(String[] args)
{
print("Beetle constructor");
Beetle b = new Beetle();
}
}

class Insect
{
private int i = 9;
protected int j;

Insect()
{
print("i = " + i + ", j = " + j);
j = 39;
}

private static int x1 = printInit("static Insect.x1 initialized");

static int printInit(String s)
{
print(s);
return 47;
}
}


/* Output:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39
*///:~

/****************************************************/

// 变量初始化先后顺序的示例
import static net.mindview.util.Print.*;

//当创建Window的实例对象时会有消息提示
class Window
{
Window(int marker)
{
print("Window(" + marker + ")");
}
}

class House
{
Window w1 = new Window(1); // 构造函数前的变量

House()
{
//构造函数里面的变量
print("House()");
w3 = new Window(33); // 重新赋值w3
}

Window w2 = new Window(2); // 构造函数后的变量

void f()
{
print("f()");
}

Window w3 = new Window(3); // 结束类体时的对象
}

public class OrderOfInitialization
{
public static void main(String[] args)
{
House h = new House();
h.f();
}
}
/*
* 输出结果: Window(1) Window(2) Window(3) House() Window(33) f()
*
* 从结果看出,虽然域变量w2,w3排在构造函数后面,但它的输出却在构造函数前面
*/

/****************************************************/

// 数组的初始化
import java.util.*;

public class ArrayInit
{
public static void main(String[] args)
{
//直接赋值方式,局限在于数组在大小编译确定
Integer[] a = {
new Integer(1),
new Integer(2),
3, // 自动包装
};
//new方式,适于参数数量未知的场合,或者参数类型未知的场合
Integer[] b = new Integer[] {
new Integer(1),
new Integer(2),
3, // 自动包装
};
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
}
}
/* 输出结果:
[1, 2, 3]
[1, 2, 3]
*///:~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值