Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6187
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-14 13:32
文章分类
文章存档

2015年(7)

我的朋友
最近访客

分类: Java

2015-01-14 13:43:10

java代码如下所示:
class Name {
Name() {
  Screen.print("8", "Name instance constructor!");
}
Name(String value) {
  Screen.print("9", "Name instance constructor with: " + value);
}
static {
  Screen.print("10", "Name static init block");
}
}
class Person {
private Name name = new Name();
static {
  Screen.print("5", "erson static init block!");
}
Person() {
  Screen.print("6", "erson instance constructor!");
}
{
  Screen.print("7", "erson instance init block!");
}
}
public class Customer extends Person {
static Name name = new Name("Tom");
static {
  Screen.print("2", "Customer static init block!");
}
{
  Screen.print("3", "Customer instance init block!");
}
Customer() {
  Screen.print("4", "Customer instance constructor!");
}
public static void main(String[] args) {
  Screen.print("1", "Customer Initial Test!");
  Person p = new Customer();
}
}
class Screen {
static void print(String sn, String msg) {
  System.out.println("[" + sn + "] - " + msg);
}
}
你能直接说出它的运行结果是什么吗?
执行结果输出为:
P[5] - Person static init block!
P[10] - Name static init block
P[9] - Name instance constructor with: Tom
P[2] - Customer static init block!
P[1] - Customer Initial Test!
P[8] - Name instance constructor!
P[7] - Person instance init block!
P[6] - Person instance constructor!
P[3] - Customer instance init block!
P[4] - Customer instance constructor!
你回答是否正确呢?
为什么呢?
解释如下:
Java code { Screen.print("7", "erson instance init block!"); }
叫实例初始化块
Java code static{ Screen.print("2", "Customer static init block!"); }
叫静态初始化块

类加载优先级顺序为:
  static区(static初始化块和类static实例变量) > 类的非static初始化区(实例初始化块和实例变量) > 类构造函数
static区在第一次遇到该类时就被加载,非static区和构造函数在创建对象(既new)时加载。同一个类的多个static区之间按代码出现的先后顺序加载,非static区亦然。static只加载一次,为类所有,不是为类对象所有。
该程序中:
1.进入Customer类,检查发现有extends,存在父类Person。
2.进入Person类,检查Person无父类存在,但有static区,执行输出"5"。因Person没被创建,所以非static区和Person构造函数不被加载。
3.进入Customer类程序体,发现有多个static区。
     第一个为static Name name = new Name("Tom")。创建Name,进入Name类,加载Name静态初始化快,输出"10"。无非static区,则加载相应构造函数,输出"9"。
     第二个出现的static是"2",输出
4.进入main线程,运行第一行输出"1"
5.创建一个无参Customer()对象。因为Person类是其父类,创建子类时,系统必自动创建一个父类对象。
     再次进入Person类,按顺序先创建Name对象。进入Name类,其static区已被加载,不需要再加载。没有非static区。调用相应构造函数,输出"8",退出name类。加载Person类第二个非static区,输出"7",然后加载其构造函数输出"6",退出Person。
     进入Customer类,加载初始化块输出"3",然后是构造函数输出"4"
6.退出main线程
user.qzone.qq.com/1743404421/main?user.qzone.qq.com/2951897743/main?user.qzone.qq.com/2807461700/maind√
user.qzone.qq.com/2091461657/main?user.qzone.qq.com/2107864875/main?user.qzone.qq.com/2545685996/main?
user.qzone.qq.com/1066910231/main?user.qzone.qq.com/1903548785/main?user.qzone.qq.com/2972673234/main?user.qzone.qq.com/1014588114/main?user.qzone.qq.com/2975702408/main?user.qzone.qq.com/2936513996/main√user.qzone.qq.com/2909975792/main?user.qzone.qq.com/2832047856/main?user.qzone.qq.com/2094866646/main?
user.qzone.qq.com/2970964528/main?user.qzone.qq.com/2972612150/main?user.qzone.qq.com/2981657046/main?user.qzone.qq.com/2417968853/main?user.qzone.qq.com/2782205648/main?user.qzone.qq.com/1430848491/main?user.qzone.qq.com/2928931597/main?user.qzone.qq.com/2934299951/main?
user.qzone.qq.com/2074885690/main?user.qzone.qq.com/2692649857/main?user.qzone.qq.com/2823935523/main?user.qzone.qq.com/2428865876/main?user.qzone.qq.com/2451903269/main?user.qzone.qq.com/1974935672/main?
user.qzone.qq.com/2067308423/main】user.qzone.qq.com/2067272164/main】user.qzone.qq.com/2067275285/main】user.qzone.qq.com/2067278589/main】user.qzone.qq.com/2067279969/main】user.qzone.qq.com/2067281326/main】user.qzone.qq.com/2067282556/main】user.qzone.qq.com/2067283152/main】user.qzone.qq.com/2067283363/main】
user.qzone.qq.com/2067290250/main】user.qzone.qq.com/2067290840/main】user.qzone.qq.com/2067291051/main】user.qzone.qq.com/2067303844/main】user.qzone.qq.com/2067304100/main】user.qzone.qq.com/2067304587/main】user.qzone.qq.com/2067306884/main】user.qzone.qq.com/2067306935/main】user.qzone.qq.com/2067307091/main】
user.qzone.qq.com/2067307258/main】user.qzone.qq.com/2067307447/main】user.qzone.qq.com/2067308423/main】user.qzone.qq.com/2067308628/main】user.qzone.qq.com/2067310485/main】user.qzone.qq.com/2067312095/main】user.qzone.qq.com/2067313650/main】user.qzone.qq.com/2067315438/main】user.qzone.qq.com/2067317694/main】user.qzone.qq.com/2067317828/main】user.qzone.qq.com/2067318359/main
阅读(144) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~