精选文章 Java那么点事

Java那么点事

作者:yangwnhotmail 时间: 2021-07-06 09:11:25
yangwnhotmail 2021-07-06 09:11:25
【摘要】
                    public class Customer extends Person {
	static Name name = new Name("Tom");
	static {
		Screen.print("2", "Customer static init block!");
	}
	{
		Screen.print("3", "Customer in...
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 Person {
	private Name name = new Name();
	static {
		Screen.print("5", "Person static init block!");
	}

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

	{
		Screen.print("7", "Person instance init block!");
	}
}

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 Screen {
	static void print(String sn, String msg) {
		System.out.println("P[" + sn + "] - " + msg);
	}
}

 

执行结果是什么?

 

类加载优先级顺序为:
static区(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线程

勿删,copyright占位
您找到想要的结果了吗?
Java那么点事
提交成功!非常感谢您的反馈,我们会继续努力做到更好
分享文章到微博
分享文章到朋友圈

上一篇:要想从容面对,就得做好准备

下一篇:Jad文件常见属性作用说明

您可能感兴趣

  • 分割源文件的Java程序

    由于从VC6到VS2005均不能调试超过65535行的代码,但是在工作中生成的解码库的源文件会远远超过这个数字,因此写了个程序来解决这个问题。程序编程语言选择Java,因为用Java来处理使用方便,编写也容易,此处对效率没有要求因此不选择用C了。 程序基于花括号匹配的原理来拆分文件,在第一个文件中include之后的文件,并将之后的文件都以.h来重...

  • java版飞信协议实现

    原始的代码不记得是哪个作者了,如果原作者看见了,我要说声谢谢 但这个真的做了大改动,我怕原作者也看不出来了~最近比较忙,如果谁愿意,去改改吧,不知道为什么,这个很不稳定,老是405错误,或者最近移动的问题? 给出代码: package myFetion;import java.io.BufferedReader;import java.io.I...

  • java 复制对象

    关于java对象复制我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如bean传递时采用的是应用传递也就是地址传递,而很多时候对于对象传递我们也希望能够象值传递一样,使得传递之前和之后有不同的内存地址,在这种情况下我们一般采用以下两种情况。1 对象克隆什么是"clone"?在实际编程过程中,我们...

  • 统计java源代码行数——coding篇

    ----------------------------------------------------------------------- 转自: http://fanyang219.iteye.com/blog/186968 ----------------------------------------------------------...

  • java axis webservice 开发实例

    今天研究了下webservice 终于OK了,所以把它写到自己的博客来,因为网上说的都很复杂 而在这里,我会很简单的说明,一看就懂 首先在进行webservice 一定要下载包 到 http://ws.Apache.org/axis/网站下载Axis安装包. 在本文章中,我已经把要用的包上传了,大家可以直接在这下就行了 然后就写wsdd 文...

  • MyEclipse 对java工程进行jar打包

    前些天在网上看了些如何将java 项目转换成jar包. 都是说什么用jar命令对java工程进行打包 我看了哈子,觉的有点复杂.其实,用MyEclipse 打成JAR包,简单.快速 具体操作如下: 1.点项目反键->Export 如图: [img]http://www.liuzm.com/logo/jar1.jpg[/img]选择jar file ...

  • 数据库mysql、sqlserver、oracle分页,java分页统一接口实现

    定义:pageStart 起始页,pageEnd 终止页,pageSize页面容量 :D oracle分页:     select * from ( select mytable.*,rownum num from (实际传的SQL) where rownum<=pageEnd) where num>=pageStart sqlServer分...

  • java instrument 初探

    java在1.5引入java.lang.instrument,你可以由此实现一个java agent,通过此agent来修改类的字节码即改变一个类。本文中,会通过java instrument 实现一个简单的profiler。当然instrument并不限于profiler,instrument可以做很多事情, 它类似一种更低级,更松耦合的AOP,...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。
Java那么点事介绍:华为云为您免费提供Java那么点事在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多Java那么点事的相关内容。| 移动地址: Java那么点事 | 写博客