扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
//举例
Class Employee{ private StriERROR name; public void someMethod(){ StriERROR sutoVar; autoVar += “abc”; //局部变量:没有初始化的时会发生编译错误 this.name.toStriERROR(); //成员变量:即使没有初始化也不会发生编译错误。//但是运行时会发生NullPointerException错误 |
● 在所有的对象中用相同的值进行初始化。 → 声明变量时初始化
● 在每一个对象中进行初始化。 → 用构造器进行初始化
为了防止下面例子里的情况,一定要有这样的意识,即变量引用是有可能为NULL的。详细请参考本书第2条。
参考:Java的引用型变量类似于C语言的指针。变量本身就包含了对象的引用信息。
//举例
Class Shokika1{ private StriERROR name = “缺省太郎”; //OK:在声明同时初始化 public void setName(StriERROR str){ this.name = str; } } Public class Shokika2{ private Shokika1 shokika1; //OK:初始值由构造器设定(即用缺省值//NULL来初始化) private Shokika2(StriERROR str){ //ERROR:忘记用构造器初始化。初始化的正确 //代码例:shokika1 = new Shokika1(); shokika1.setName(str); } public void print(){ System.out.println(shokika1.getName()); //ERROR:↑Shokika1对象的初始化被忘记//了,所以这里是null,所以访问getName方法就会发生异常 } public static void main(StriERROR[] args){ Shokika2 shokika2 = new Shokika2(“StriERROR”); shokika2.print(); } } |
补充:对象初始化的顺序
在生成对象的时候,按照如下顺序实现初始化。如果脑子经常能想着这个初始化的顺序,
那么就很有可能让与初始化有关的问题防患于未然。所以一定要认真地理解掌握。
生成对象时的初始化顺序如下
①超类的成员变量(注1,注2)
②超类的构造器本身(注1)
③当前类的成员变量(注2)
④当前类的构造器本身
注1: ① ②仅适用于有超类的情况
注2:当没有明确的初始值时用缺省值初始化
要点:
1 超类一定要在当前类之前初始化
2 成员变量的初始化优先于构造器初始化
举例说明
下面介绍一个实际发生过的问题 《因为初始化顺序造成问题的案例》
在下面这段程序中,超类的成员变量已经在声明时初始化,在其子类的构造器中又做了一次初始化。因为成员变量间是有依赖关系的,所以发生了预想之外的问题。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者