“全栈2019”Java第四十二章:静态代码块与初始化顺序

120 阅读6分钟
原文链接: www.toutiao.com

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。

1.所有变量在使用前必须初始化

演示:

局部变量未初始化就使用,编译器会报错。

实现:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

错误信息:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

文字版:

Error:(9, 28) java: 可能尚未初始化变量i

局部变量使用前必须初始化。

演示:

字段有默认初始值,不必显式初始化。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

运行过程中没有报错,字段都被初始化。

2.初始化字段

演示:

初始化字段。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

当声明字段并初始化时,这很有效。 然而,这种形式的初始化由于其简单性而具有局限性。 如果初始化需要一些逻辑(例如,错误处理或for循环来填充复杂数组),则简单的赋值是不合适的。实例变量可以在构造方法中初始化,其中可以使用错误处理或其他逻辑。 为了为类变量提供相同的功能,Java编程语言包括静态初始化块。

3.实例变量在构造方法中初始化

实例变量可以在构造方法中初始化,其中可以使用错误处理或其他逻辑。

演示:

在构造方法中初始化实例变量。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

这些变量会先被初始化一遍,值为它们的默认值。然后再经过构造方法进行初始化。

也就是在构造方法初始化之前:

id = 0;

name = null;

age = 0;

height = 0.0d;

构造方法执行之后:

id = 0;

name = "Tom";

age = 20;

height = 182.0;

4.使用字段来初始化字段

演示:

使用已经初始化过的字段来初始化未初始化字段。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

运行结果准确无误。

但是,我们不能使用未初始化字段给未初始化字段初始化。

修改Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类无需修改。

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

错误信息:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

文字版:

Error:(11, 22) java: 非法前向引用

5.使用无参方法初始化字段

演示:

使用方法返回字段需要的值,从而初始化字段。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

6.使用有参方法初始化字段

上面演示了使用无参方法初始化字段。

演示:

使用有参方法初始化字段。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

运行结果准确无误。

但是,有一种情况会出错。我们来看一下。

演示:

参数使用到还未初始化的字段。

实现:

只需将Student的id字段修改为:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类无需修改。

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

错误信息:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

文字版:

Error:(11, 29) java: 非法前向引用

程序的正确性取决于初始化的顺序,而与其编译方式无关。上述程序错误使用了还未初始化的字段age。age字段使用id字段是可以的,因为在使用id字段前,id字段已经被初始化。

7.使用类变量初始化字段

演示:

使用类变量初始化字段。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

运行结果准确无误。

当我们使用类变量初始化字段时,不必考虑类变量定义的位置。

8.使用静态初始化块初始化类变量

静态初始化块只能初始化类变量,不能初始化实例变量。

静态初始化块又称之为静态代码块、静态初始化子句。

演示:

使用静态初始化块初始化类变量。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

这里我们可以看到,静态初始化块已经成功地完成了初始化任务。

9.使用静态方法初始化类变量

静态方法又称之为类方法。

演示:

使用静态方法初始化类变量。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

运行结果准确无误。

那么,先定义的类变量如果使用到后定义的类变量会报错吗?继续往下看。

10.使用类变量初始化类变量

演示:

使用类变量初始化类变量。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

错误信息:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

文字版:

Error:(31, 41) java: 非法前向引用

我们发现,所有字段,无论静态还是非静态都不能使用后定义的字段。

修改Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类无需修改。

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

11.使用实例初始化块初始化实例变量

实例初始化块又称之为非静态代码块。

它比静态代码块少了一个static关键字。

演示:

使用实例初始化块初始化实例变量。

实现:

Student类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

Main类:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

结果:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

我们可以使用实例初始化块专门来初始化实例变量。

12.初始化顺序

请说出以下程序的初始化顺序:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

第一步,类变量初始化,numberOfStudent为默认值0:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

第二步,静态初始化块,numberOfStudent为99:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

第三步,实例变量初始化,id为默认值0:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

第四步,实例初始化块,id为99:

“全栈2019”Java第四十二章:静态代码块与初始化顺序

第五步,构造方法

“全栈2019”Java第四十二章:静态代码块与初始化顺序

总结

  • 所有变量在使用前必须初始化。
  • 局部变量使用前必须初始化。
  • 字段有默认初始值,不必显式初始化。
  • 类变量可以只声明,使用默认值。
  • 类变量可以边声明,边初始化。
  • 类变量可以在静态初始化块里面进行初始化。
  • 实例变量可以只声明,使用默认值。
  • 实例变量可以边声明,边初始化。
  • 实例变量可以使用类变量初始化。
  • 实例变量可以在实例初始化块里面进行初始化。
  • 静态初始化块格式:static{ }
  • 实例初始化块格式:{ }
  • 类变量、实例变量、静态初始化块、实例初始化块、构造方法的执行顺序是(1)类变量(2)静态初始化块(3)实例变量(4)实例初始化块(5)构造方法

至此,Java中静态代码块与初始化顺序相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java第四十一章:static关键字

下一章

“全栈2019”Java第四十三章:封装

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

“全栈2019”Java第四十二章:静态代码块与初始化顺序

版权声明

原创不易,未经允许不得转载!