难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.所有变量在使用前必须初始化
演示:
局部变量未初始化就使用,编译器会报错。
实现:
结果:
错误信息:
文字版:
Error:(9, 28) java: 可能尚未初始化变量i
局部变量使用前必须初始化。
演示:
字段有默认初始值,不必显式初始化。
实现:
Student类:
Main类:
结果:
运行过程中没有报错,字段都被初始化。
2.初始化字段
演示:
初始化字段。
实现:
Student类:
Main类:
结果:
当声明字段并初始化时,这很有效。 然而,这种形式的初始化由于其简单性而具有局限性。 如果初始化需要一些逻辑(例如,错误处理或for循环来填充复杂数组),则简单的赋值是不合适的。实例变量可以在构造方法中初始化,其中可以使用错误处理或其他逻辑。 为了为类变量提供相同的功能,Java编程语言包括静态初始化块。
3.实例变量在构造方法中初始化
实例变量可以在构造方法中初始化,其中可以使用错误处理或其他逻辑。
演示:
在构造方法中初始化实例变量。
实现:
Student类:
Main类:
结果:
这些变量会先被初始化一遍,值为它们的默认值。然后再经过构造方法进行初始化。
也就是在构造方法初始化之前:
id = 0;
name = null;
age = 0;
height = 0.0d;
构造方法执行之后:
id = 0;
name = "Tom";
age = 20;
height = 182.0;
4.使用字段来初始化字段
演示:
使用已经初始化过的字段来初始化未初始化字段。
实现:
Student类:
Main类:
结果:
运行结果准确无误。
但是,我们不能使用未初始化字段给未初始化字段初始化。
修改Student类:
Main类无需修改。
结果:
错误信息:
文字版:
Error:(11, 22) java: 非法前向引用
5.使用无参方法初始化字段
演示:
使用方法返回字段需要的值,从而初始化字段。
实现:
Student类:
Main类:
结果:
6.使用有参方法初始化字段
上面演示了使用无参方法初始化字段。
演示:
使用有参方法初始化字段。
实现:
Student类:
Main类:
结果:
运行结果准确无误。
但是,有一种情况会出错。我们来看一下。
演示:
参数使用到还未初始化的字段。
实现:
只需将Student的id字段修改为:
Main类无需修改。
结果:
错误信息:
文字版:
Error:(11, 29) java: 非法前向引用
程序的正确性取决于初始化的顺序,而与其编译方式无关。上述程序错误使用了还未初始化的字段age。age字段使用id字段是可以的,因为在使用id字段前,id字段已经被初始化。
7.使用类变量初始化字段
演示:
使用类变量初始化字段。
实现:
Student类:
Main类:
结果:
运行结果准确无误。
当我们使用类变量初始化字段时,不必考虑类变量定义的位置。
8.使用静态初始化块初始化类变量
静态初始化块只能初始化类变量,不能初始化实例变量。
静态初始化块又称之为静态代码块、静态初始化子句。
演示:
使用静态初始化块初始化类变量。
实现:
Student类:
Main类:
结果:
这里我们可以看到,静态初始化块已经成功地完成了初始化任务。
9.使用静态方法初始化类变量
静态方法又称之为类方法。
演示:
使用静态方法初始化类变量。
实现:
Student类:
Main类:
结果:
运行结果准确无误。
那么,先定义的类变量如果使用到后定义的类变量会报错吗?继续往下看。
10.使用类变量初始化类变量
演示:
使用类变量初始化类变量。
实现:
Student类:
Main类:
结果:
错误信息:
文字版:
Error:(31, 41) java: 非法前向引用
我们发现,所有字段,无论静态还是非静态都不能使用后定义的字段。
修改Student类:
Main类无需修改。
结果:
11.使用实例初始化块初始化实例变量
实例初始化块又称之为非静态代码块。
它比静态代码块少了一个static关键字。
演示:
使用实例初始化块初始化实例变量。
实现:
Student类:
Main类:
结果:
我们可以使用实例初始化块专门来初始化实例变量。
12.初始化顺序
请说出以下程序的初始化顺序:
第一步,类变量初始化,numberOfStudent为默认值0:
第二步,静态初始化块,numberOfStudent为99:
第三步,实例变量初始化,id为默认值0:
第四步,实例初始化块,id为99:
第五步,构造方法
总结
- 所有变量在使用前必须初始化。
- 局部变量使用前必须初始化。
- 字段有默认初始值,不必显式初始化。
- 类变量可以只声明,使用默认值。
- 类变量可以边声明,边初始化。
- 类变量可以在静态初始化块里面进行初始化。
- 实例变量可以只声明,使用默认值。
- 实例变量可以边声明,边初始化。
- 实例变量可以使用类变量初始化。
- 实例变量可以在实例初始化块里面进行初始化。
- 静态初始化块格式:static{ }
- 实例初始化块格式:{ }
- 类变量、实例变量、静态初始化块、实例初始化块、构造方法的执行顺序是(1)类变量(2)静态初始化块(3)实例变量(4)实例初始化块(5)构造方法
至此,Java中静态代码块与初始化顺序相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第四十三章:封装
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!