Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 3522|回复: 0

测试下你是否真的理解JAVA运行机以及执行顺序

  [复制链接]

该用户从未签到

发表于 2011-7-26 22:21:49 | 显示全部楼层 |阅读模式
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", &quoterson static init block!");
}

Person() {
   Screen.print("6", "Person instance constructor!");
}

{
   Screen.print("7", "Person 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("P[" + 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", "Person 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线程
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-3-29 15:14 , Processed in 0.354305 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表