初始化顺序的规则

1.在一个类的对象实例化时,成员变量首先初始化,然后才调用构造器,无论书写顺序。如果调用构造器前,没有显式初始化,那么会赋默认值。

这样做法的原因可以理解为:构造器执行时可能会用到一些成员变量的初值。

2.static变量早于所有其他的类成员变量初始化,同样无论书写顺序。但是static变量仅在所在类第一次被使用时初始化一次。

3.基类构造器总是在导出类的构造过程中被调用,而且按照继承层级逐渐向上链接(调用顺序则是从基类开始向下)。可以理解为,这么做的逻辑关系是在一个类构建时可能会用到其父类的成员、方法。在清理时顺序相反。

4.成员的初始化方法(包括基本数据类型的赋值)在基类构造器调用之后才会被调用。最初时,分配给对象的存储空间初始化二进制的零。

例一出自《Java编程思想》第5.7.2节,为了便于演示初始化顺序,进行了缩减和重新编号。用构造器的参数标明执行顺序,演示1~2条规则:

class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
} class Cupboard {
Bowl bowl1 = new Bowl(3);
static Bowl bowl2 = new Bowl(1);
int i;
static int j = 5;
Cupboard() {
System.out.println("i:" + i);
bowl4 = new Bowl(j);
j = 6;
}
Bowl bowl3 = new Bowl(4);
static Bowl bowl4 = new Bowl(2);
} public class ParaInitialization {
public static void main(String args[]) {
new Cupboard();
new Cupboard();
}
}

输出及对应注释:

Bowl(1)      //第一个static变量
Bowl(2)      //第二个static变量
Bowl(3)      //第一个对象的第一个非static成员变量
Bowl(4)             //第一个对象的第一个非static成员变量
i:0         //未显示初始化的成员变量
Bowl(5)      //更改static变量的值
Bowl(3)     //第二个对象的第一个非static成员变量
Bowl(4)     //第二个对象的第二个非static成员变量
i:0
Bowl(6)

  例二是一个演示第3条规则的简单示例。

class A {
A() {
System.out.println("A");
}
} class B extends A {
B() {
System.out.println("B");
}
} class C extends B {
C() {
System.out.println("C");
}
} public class hrt {
public static void main(String args[]) {
new C();
}
}

输出

A
B
C

例三用于演示规则4。调用父类构造器时,构造器中的方法被子类方法覆盖。

class Glyph {
void draw() {
System.out.println("Glyph.draw(");
} Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
} class RoundGlyph extends Glyph {
int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
} void draw() {
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
} public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}

这么多条规则,记起来实在让人头大。将它们按顺序编排会易读很多。

对象初始化顺序,如果有对应成员/父类的才执行对应条目:

1.将分配给对象的存储空间初始化为二进制的零;

2.调用基类构造器,从最顶层/根的基类开始;

3.按照声明的顺序,使用直接的赋值或者初始化方法,先依次初始化static变量,再依次初始化非static变量;

4.调用本对象所属类的构造器。 

Java入门记(三):初始化顺序的更多相关文章

  1. Java入门记(五):容器关系的梳理(下)——Map

    注意:阅读本文及相关源码时,需要数据结构相关知识,包括:哈希表.链表.红黑树. Map是将键(key)映射到值(value)的对象.不同的映射不能包含相同的键:每个键最多只能映射到一个值.下图是常见M ...

  2. Java入门(三):变量和运算符

    上次谈到了Java的基本数据类型,今天接着聊Java的变量.运算符. 一.变量 1.变量的分类 变量分为成员变量.局部变量和常量,其中成员变量又分为实例变量.类变量. 2.变量的定义 语法:变量类型( ...

  3. Java 类成员的初始化顺序

    Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究.   1  无继承情况下的Jav ...

  4. Java中的成员初始化顺序和内存分配过程

    Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...

  5. Java类的成员初始化顺序

    Java类的成员初始化顺序 2017-06-01 代码: public class InitializeSequence { public static void main(String[] args ...

  6. java类的成员初始化顺序和初始化块知识

    java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和自由块都是类中的成员 ...

  7. Java类的变量初始化顺序

    大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台 ...

  8. Java继承时的初始化顺序

    Java程序在启动和运行时,需要首先完成初始化的工作.在涉及到继承.static成员变量等因素时,初始化的顺序就复杂起来.下面以一个例子说明继承时的Java初始化顺序. 例子: class Insec ...

  9. Java静态方法,静态变量,初始化顺序

    1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实 ...

随机推荐

  1. Objective-C的 KVC和KVO

    字面意思分别是: KVC是指key value coding,键值编码. KVO是指key value observing,键值观察. 直白的说法是: KVC就是将一个对象的属性及其值当做一个字典,可 ...

  2. deepin gala窗口管理器关闭动画

    deepin中有两个管理器,一个基于metacity,另一个基于gala,可以用super+tab来进行切换.metacity是不带动画的,而 gala是带动画效果的.但这里有个问题,不知道有些同学上 ...

  3. Jackson的使用

    Jackson框架是基于Java平台的一套数据处理工具,被称为"最好的JavaJson解析器". Jackson框架包含了3个核心库:streaming,databind,anno ...

  4. 拥抱高效、拥抱 Bugtags 之来自用户的声音 2

    小编按:这是一篇 Bugtags 用户来稿,主要是介绍了使用 Bugtags 前后对测试及解决 Bug 所带来的变化,感谢单车娱乐 App 工程师 - 李斌同学对 Bugtags 的信赖和支持.小编在 ...

  5. 第五届山东ACM大赛汇总

    A.angry_birds_again_and_again 简单积分: http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem& ...

  6. 线程,join合并线程

    在A中,调用B.join()那么,A会“等”B先执行 public class Join01 extends Thread { @Override public void run() { int su ...

  7. 从头开始学算法--NUM operation in MIX

    从前往后,按照课本顺序刚刚看到MIX这部分.NUM是一个转换操作符,可以把字符编码转换为数字.它把registerA & registerX的值转换为数字并赋值给registerA.转换过程是 ...

  8. agile/scrum 如果一切都从解放前开始

    一个非常珍贵的机会,聚集了公司很多牛人,进行了一场发人深省的讨论.有一个话题我想拿出来和他家分享一下我的看法. 越来越不舒服的站会 站会是每天都在固定的时间.地点,大概持续15分钟左右(我们的小组都比 ...

  9. 【小错误】SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled

    1.今天在scott用户下执行语句跟踪时报了如下错误: SCOTT@ORA11GR2>set autotrace on SP2: Cannot find the Session Identifi ...

  10. 习课的视频播放器 video.js

    jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncod ...