了解包括继承在内的初始化全过程,以对所发生的的一切有一个全局的把握,是很有益的。

请看下例:

package initialize;

class Insect {
private int i = 9;
protected int j; Insect() {
System.out.println("i = " + i + ", j = " + j);
j = 39;
} private static int x1 = printInit("static Insect.x1 initialized");
static int printInit(String s) {
System.out.println(s);
return 47;
} } public class Beetle extends Insect{
private int k = printInit("Beelte.k initialized");
public Beetle(){
System.out.println("k = " + k);
System.out.println("j = " + j);
} private static int x2 =
printInit("static Beetle.x2 initialized"); public static void main(String[] args) {
System.out.println("Beetle constructor");
//Beetle beetle = new Beetle(); //此处先注释
} }

  运行结果:

  

  在运行Beetle时,所发生的第一件事就是试图访问Beetel.main()方法(程序入口)(一个static方法),

于是加载器就开始启动并找到Beetel类的编译代码(在Beetle.class文件中)。对他进行加载时,发现他有一个基类(这是由“extents”关键字得知的),于是继续进行加载该基类。不管是否你是否打算生成一个该基类的对象,都会发生。从上出代码Beelte.main()方法中的注释代码证明这一点。

  如果该基类还有其自身的基类,那么第二个就会被加载,如此类推。接下来,根基类中的static方法初始化(此例中为Insect)即会被执行,然后是下一个导出类,如此类推。

  至此,必要的类都加载完毕,对象就可以创建了,我们把上面的Beelte.main()方法中的注释代码取消,

  运行结果:

  

首先对象中所有基本类型都会被设为某默认值,对象引用都设为null,然后基类的构造器会被调用。基类的构造器和导出类的构造器一样,以相同的顺序经历相同的过程。基类构造器完成之后,实例变量按其次序被初始化。

习题:请证明加载类的动作只发生一次。证明该类的第一个实体的创建或static成员的访问都有可能引起加载。

  在Beelte.main()方法中添加一行代码:

    Beetle beetle2 = new Beetle();

   输出结果:

    

《Think in JAVA》之每日一读(initianlize)——2013/11/12、13的更多相关文章

  1. 【Java例题】3.1 7、11、13的倍数

    1.找出1~5000范围内分别满足如下条件的数: (1) 7或11或13的倍数 (2) 7.11,或7.13或11.13的倍数 (3) 7.11和13的倍数. package chapter3; pu ...

  2. java 可重入读写锁 ReentrantReadWriteLock 详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt206 读写锁 ReadWriteLock读写锁维护了一对相关的锁,一个用于只 ...

  3. java试题复盘——11月13日

    上: 10. AccessViolationException异常触发后,下列程序的输出结果为(   A   ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 AccessViol ...

  4. java中多种方式读文件

    转自:http://www.jb51.net/article/16396.htm java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内 ...

  5. Java并发:ReadWriteLock 读写锁

    读写锁在同一时刻可以允许多个线程访问,但是在写线程访问,所有的读线程和其他写线程均被阻塞. 读写锁不像 ReentrantLock 那些排它锁只允许在同一时刻只允许一个线程进行访问,读写锁可以允许多个 ...

  6. 【转】成为Java顶尖程序员 ,看这11本书就够了

    成为Java顶尖程序员 ,看这11本书就够了 转自:http://developer.51cto.com/art/201512/503095.htm 以下是我推荐给Java开发者们的一些值得一看的好书 ...

  7. Java面试题:n=2\n1*2*5*6\n--3*4\n\nn=3\n1*2*3*10*11*12\n--4*5*8*9\n----6*7\n如何实现如上结构的数据

    今天学长在面试的时候遇到了一道题,然后让大家做一做. 在不看下面的答案之前,悠闲的朋友们一起来抖动一下大脑吧! 以下是我的想法: import java.util.Scanner;public cla ...

  8. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  9. java的poi技术读,写Excel[2003-2007,2010]

    在上一篇blog:java的poi技术读取Excel[2003-2007,2010] 中介绍了关于java中的poi技术读取excel的相关操作 读取excel和MySQL相关: java的poi技术 ...

随机推荐

  1. phpdocumentor生成代码注释文档(linux)

    1,默认安装lnmp环境(php7),默认pear安装 2,   pear channel-discover pear.phpdoc.org pear install phpdoc/phpDocume ...

  2. ActiveMQ-在Centos7下安装和安全配置

    环境准备: JDK1.8 ActiveMQ-5.11 Centos7 1.下载Linux版本的ActiveMQ: $ wget http://apache.fayea.com/activemq/5.1 ...

  3. Adobe CC Family 2015 Master 或 Adobe CC Family 2017 Master的安装步骤(图文详解)

    不多说,直接上干货!   你还在为安装PS烦恼吗?你还在为制作视频软件寻找烦恼吗?..... 前言 现在,已经出来了 简单了解, Adobe Acrobat的百度百科: http://baike.ba ...

  4. Gen中的switch分析及lookupswitch与tableswitch指令

    int chooseNear(int i) { switch (i) { case 0: return 0; case 1: return 1; case 2: return 2; default: ...

  5. IntelliJ IDEA使用心得之非Maven项目篇

    今天和大家分享下非Maven项目在IDEA中的配置方法,由于非Maven项目的配置方法基本相同,所以此篇只对不同点进行说明. 1.声明依赖库 我们可以使用库的方式来添加项目依赖,这是一个非常好的实践. ...

  6. numpy.linalg.norm(求范数)

    1.linalg=linear(线性)+algebra(代数),norm则表示范数. 2.函数参数 x_norm=np.linalg.norm(x, ord=None, axis=None, keep ...

  7. SpringMVC 使用 RESTful 架构实现 CRUD 操作

    软件152 余建强 源码下载:http://download.csdn.net/detail/qq_35318576/9826210 1 使用框架 SpringMVC.Maven.Ajax.JSTL. ...

  8. Hibernate中一级缓存概念以及flush与clear的区别

    Hibernate采用缓存机制提高数据查询效率.缓存分为一级缓存和二级缓存,一级缓存在Session中存在,二级缓存需要手动配置. 在一级缓存中,如果数据保存到数据库中后,而session又没有关闭的 ...

  9. 二:Servlet

    一:servlet开端 1.servlet是什么? a.就是一个java类 b.服务器端的小程序 c.处理用户请求 2.servlet的实现: a.实现Servlet接口 b.继承GenericSer ...

  10. Java 源程序与编译型运行区别