这个教程,咱们来对Java中设计到的初始化规则,或者说初始化顺序,来做一下汇总,这里我基本上把Java中,默认初始化,静态成员初始化,非静态成员初始化,静态代码块,非静态代码块,以及继承中所涉及到的初始化,都涵盖全了。希望你看到这个教程,能有所收获。(๑´ڡ`๑)

默认初始化

在Java中,一个类的数据成员(成员变量)如果没有指定初始化,那么Java会对其执行默认初始化。

基本类型初始化默认值为0,boolean为false,字符串或者对象引用初始化为null。这部分比较简单,看下面这个小列子,相信你应该能直接看出来最后运行的结果。(<_>

public class InitialValues {

boolean t;

char c;

short s;

int i;

long l;

float f;

double d;

String str;

InitialValues reference;

void printInitialValues() {

System.out.printf("%-10s %-5s\n", "boolean:", t);

System.out.printf("%-10s %-5s\n", "char:", c);

System.out.printf("%-10s %-5s\n", "short:", s);

System.out.printf("%-10s %-5s\n", "int:", i);

System.out.printf("%-10s %-5s\n", "long:", l);

System.out.printf("%-10s %-5s\n", "float:", f);

System.out.printf("%-10s %-5s\n", "double:", d);

System.out.printf("%-10s %-5s\n", "String:", str);

System.out.printf("%-10s %-5s\n", "reference:", reference);

}

public static void main(String[] args) {

InitialValues iv = new InitialValues();

iv.printInitialValues();

}

}

// Output

----------------

boolean: false

char:

short: 0

int: 0

long: 0

float: 0.0

double: 0.0

String: null

reference: null

非静态成员初始化顺序

在一个类中,非静态成员的初始化,发生在任何方法(包括构造器)被调用之前。并且它们定义的顺序,决定了初始化的顺序。来看下面这个小程序,这里的类,我都用的通用的无实际意义的类,这样能让咱们把注意力放在代码逻辑上。这个小程序,我给你提点要求:你捋一下代码的逻辑,看看能不能直接写出来最后的运行结果。完了把你写的结果和我后面给你的答案对比一下,看看能不能搞对。最后你自己最好能敲敲程序运行一下。( •̀⊿•́)ง

class XXX {

XXX(String s){ System.out.println("XXX > " + s); }

}

class AAA {

XXX x001 = new XXX("001");

AAA() {

System.out.println("AAA");

XXX x004 = new XXX("004");

}

XXX x002 = new XXX("002");

void fff() { System.out.println("fffffffff"); }

XXX xxx003 = new XXX("003");

}

public class Initialization {

public static void main(String[] args) {

AAA aaa = new AAA();

aaa.fff();

}

}

// Output

---------

XXX > 001

XXX > 002

XXX > 003

AAA

XXX > 004

fffffffff

静态成员初始化及对象的创建过程

以名为YYY的类举例:

当该类的静态方法(包括main()和构造器,构造器实际上也是静态方法)或者静态成员被调用或访问时,Java虚拟机将载入类所对应的YYY.class文件,并创建其Class类对象,然后该类所有的静态成员将执行初始化。并且静态成员初始化只执行这一次。

静态初始化完成后,该类就做好了创建对象的准备。当调用new YYY()创建对象的时候,首先在堆内存上为YYY对象分配空间,然后执行默认初始化(基本类型初始化为0,引用类型初始化为null)。

之后,按照非静态成员定义顺序,进行指定初始化。

最后执行构造器,完成对象的创建。

还是和上面同样的要求,先捋代码逻辑,再手写结果。 (`・ω・´)ゞ

class XXX {

XXX(String s){ System.out.println("XXX > " + s); }

void xox(String s){ System.out.println("xox : " + s); }

}

class AAA {

XXX x001 = new XXX("001");

static XXX x002 = new XXX("002");

AAA() {

System.out.println("AAA");

x002.xox("002");

}

void aaa() { System.out.println("aaa"); }

}

class BBB {

static XXX x003 = new XXX("003");

XXX x004 = new XXX("004");

BBB(){

System.out.println("BBB");

x004.xox("004");

}

void bbb(){System.out.println("bbb");}

}

public class Initialization {

public static void main(String[] args) {

System.out.println("*********");

new AAA();

System.out.println("=========");

new BBB();

a002.aaa();

b002.bbb();

}

AAA a001 = new AAA();

static AAA a002 = new AAA();

static AAA a003= new AAA();

BBB b001 = new BBB();

static BBB b002 = new BBB();

static BBB b003 = new BBB();

}

// Output

---------

XXX > 002

XXX > 001

AAA

xox : 002

XXX > 001

AAA

xox : 002

XXX > 003

XXX > 004

BBB

xox : 004

XXX > 004

BBB

xox : 004

*********

XXX > 001

AAA

xox : 002

=========

XXX > 004

BBB

xox : 004

aaa

bbb

静态块代码初始化

其实,整个static { 静态代码块 } 可以看作是一个静态成员。当一个类需要执行静态初始化时,该类中的静态成员初始化和静态代码块,会按照先后定义的顺序执行。当然,这个流程也是就执行这一次。ღ⊙□⊙╱ 还是老要求......

class XXX {

XXX(String s){ System.out.println("XXX > " + s); }

}

class AAA {

XXX x001 = new XXX("001");

static XXX x002 = new XXX("002");

static XXX x003, x004;

static {

System.out.println("*********");

x003 = new XXX("003");

x004 = new XXX("004");

XXX x005 = new XXX("005");

System.out.println("=========");

/**System.out.println(x006);*/

}

static XXX x006 = new XXX("006");

XXX x007 = new XXX("007");

AAA() { System.out.println("AAA"); }

}

public class Initialization {

static AAA aaa = new AAA();

public static void main(String[] args) {

new AAA();

}

}

// Output

---------

XXX > 002

*********

XXX > 003

XXX > 004

XXX > 005

=========

XXX > 006

XXX > 001

XXX > 007

AAA

XXX > 001

XXX > 007

AAA

假如把上面/**System.out.println(x006);*/注释掉的代码解除注释,再运行程序,会发生什么情况?

非静态代码块初始化

{ 非静态代码块 },可以看作一个非静态成员。涉及非静态初始化,也会执行它。和普通的非静态成员初始化一样,它的执行也发生在构造器调用之前,并且每当创建对象之前都会调用。

稍微修改下上面的例子,把静态代码块前面的static关键字去掉,并把里面的注释行释放,并添加一行打印语句,如下,对比两个例子输出结果。(=•̀口•́=)

class XXX {

XXX(String s){ System.out.println("XXX > " + s); }

}

class AAA {

XXX x001 = new XXX("001");

static XXX x002 = new XXX("002");

static XXX x003, x004;

{

System.out.println("*********");

x003 = new XXX("003");

x004 = new XXX("004");

XXX x005 = new XXX("005");

System.out.println("=========");

System.out.println(x006);

System.out.println(x001);

}

static XXX x006 = new XXX("006");

XXX x007 = new XXX("007");

AAA() { System.out.println("AAA"); }

}

public class Initialization {

static AAA aaa = new AAA();

public static void main(String[] args) {

new AAA();

}

}

// Output

-------------

XXX > 002

XXX > 006

XXX > 001

*********

XXX > 003

XXX > 004

XXX > 005

=========

XXX@1540e19d

XXX@677327b6

XXX > 007

AAA

XXX > 001

*********

XXX > 003

XXX > 004

XXX > 005

=========

XXX@1540e19d

XXX@14ae5a5

XXX > 007

AAA

继承中涉及的初始化

大的原则是:没有父类,就没子类。初始化,当然要先初始化父类,再初始化子类。

继承中如果同时涉及到静态初始化和非静态初始化。初始化的执行流程分两步走:

(1)先执行静态初始化。且先静态初始化父类,然后再静态初始化子类。(这一步同样就执行一次)

(2)父类执行非静态初始化,然后调用构造方法。接着子类执行非静态初始化,然后调用构造方法。接着下一个子类......以此类推到最后一个子类。 (•̀ω•́ 」∠)

class XXX {

XXX(String s){ System.out.println("XXX > " + s); }

}

class AAA {

XXX x001 = new XXX("001");

static XXX x002 = new XXX("002");

AAA() {

System.out.println("AAA");

}

{

System.out.println("*********");

XXX x003 = new XXX("003");

}

static XXX x004;

static {

System.out.println("=========");

x004 = new XXX("004");

}

static XXX x005 = fff("005");

static XXX fff(String s) {

System.out.println("fffffffff");

return new XXX(s);

}

}

class BBB extends AAA {

static XXX x006 = new XXX("006");

XXX x007= new XXX("007");

{

System.out.println("+++++++++");

XXX x008 = new XXX("008");

}

static XXX x009;

static {

System.out.println("$$$$$$$$$");

x009 = new XXX("009");

}

BBB(){

System.out.println("BBB");

}

static XXX x010 = fff("010");

}

public class Initialization {

public static void main(String[] args) {

new BBB();

new BBB();

}

}

// Output

---------

XXX > 002

=========

XXX > 004

fffffffff

XXX > 005

XXX > 006

$$$$$$$$$

XXX > 009

fffffffff

XXX > 010

XXX > 001

*********

XXX > 003

AAA

XXX > 007

+++++++++

XXX > 008

BBB

XXX > 001

*********

XXX > 003

AAA

XXX > 007

+++++++++

XXX > 008

BBB

拓展一下,假如把上面的父类AAA改为抽象类,运行结果还一样吗?自己求证一下吧。

好,暂时先写这么多,希望多多少少帮到了你点什么,后面我想到有需要补充的,我再更新帖子吧。✿✿ヽ(゚▽゚)ノ✿

============================================================================

有条件的小伙伴,可以给打赏点儿支持下,给我些鼓励继续写下去。 (๑´ㅂ`๑́)و✧

java项目初期化_Java初始化规则都不懂,搞什么开发!相关推荐

  1. java 全站静态化_java如何页面全站静态化

    静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别?       比对如下:                               ...

  2. java项目总结范文_java工程师年终总结及明年计划范文

    时间一晃而过,眨眼2020年的将要来临,那么java工程师年终总结及明年计划该怎样写呢?下面就是小编给大家带来的java工程师年终总结及明年计划范文,希望大家喜欢! 篇1:java工程师年终总结及明年 ...

  3. java项目经理工资_java项目经理工资待遇及月薪是多少?

    现在是大学生毕业季,很多大学生都在忙着找工作.但还有很多同学不知java项目经理工资待遇及月薪是多少?具体做什么工作?下面是由93高考网小编就拿北京市java项目经理工资待遇来详细说一下,希望能够帮助 ...

  4. java课程有哪些_java专业课程都有哪些呢?

    随着现在报考java专业的学生人数,每年都有增长的趋势,而且有不少院校都已经扩招了.相信大家都想了解一下java专业专业课程都有哪些吧?今天小编为大家整理了相关的课程介绍. 1.Java 程序设计基础 ...

  5. java项目src路径_java 得到项目src路径

    一 相对路径的获得 说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目) String relativelyPath=System.getProper ...

  6. 【转】Java类成员变量默认初始化规则

    一个变量作为类成员使用的时候,如果没有被初始化,java会为其分配默认值: -------------------------------------------------------------- ...

  7. java项目遇到难题_Java项目遇到的常见问题

    做Java算是新手吧,难免会遇到一些问题,生活中不乏各种各样的问题,乏的是记录下来的博客O(∩_∩)O 问题一. DescriptionResourcePathLocationType Java co ...

  8. java十六进制转二进制_Java进制都有哪些?

    定义 进制也就是进位计数制,是人为定义的带进位的计数方法. 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位. 常用进制类型 二进制 · 计算机底层都是使用二进 ...

  9. java swing最小化_Java swing 窗口最小化到任务栏 点击右键显示菜单(复制代码即可运行查看效果)...

    Java swing 窗口最小化到任务栏 点击右键显示菜单(复制代码即可运行查看效果) package swing; import java.awt.AWTException; import java ...

最新文章

  1. MySql 查询表字段数
  2. 码书:入门中文NLP必备干货:5分钟看懂“结巴”分词(Jieba)
  3. 剑指offer:数组中只出现一次的数字
  4. python经典小游戏-python零基础入门的小游戏。
  5. 自定义博客园地址栏ico图标 标签logo
  6. Python多线程——LOCK锁
  7. 小黑小波比.sql语句截取字符串的子串
  8. Redis客户端命令行redis-cli操作
  9. 机器学习的最佳学习路线,就在这里!
  10. 安装TPCC-MySQL报错
  11. c语言:从标准输入读取几行输入,输入打印到标准输出上,加上行号
  12. 每日算法系列【LeetCode 1186】删除一次得到子数组最大和
  13. JDBC学习(九、连接池技术)
  14. 第1讲:软件测试背景
  15. 最大连续区间和算法详解+代码
  16. 实力验证:金蝶EAS 8.2授权注册 (包含Apusic 9999连接数破解)
  17. K8S异常 sonar status is ‘PENDING’
  18. 区块链开发金融交易平台
  19. 深夜的呼唤,无尽的力量
  20. 一个C/C++协程库的思考与实现之协程栈的动态按需增长

热门文章

  1. 90 年代的网页设计,有点搞笑
  2. Linux nginx 安装 部署运行前端项目
  3. Android百度地图V3.20隐藏百度图标、比例尺、缩放按钮方法
  4. 网站制作-LAMP环境(分离部署)
  5. 【更好的中文语音识别SpeechBrain Win10/11本地部署,基于Aishell】
  6. Makeblock教育机器人
  7. Visual Studio 2019的使用
  8. 力新国际电子商务网站设计制作
  9. tips-tools
  10. VC/MFC实现版本的在线升级提示和下载(服务器配置文件的方法)