问题描述
classA{privatestaticAa=null;doubler;privateA(){r=Math.random();}publicdoublegetR(){returnr;}publicstaticAgetFun(){if(a==null){Aa=newA();//这个为什么有问题啊a=newA();这个为什么对啊?????}returna;}}publicclassSing{publicstaticvoidmain(String[]args){Aa1=A.getFun();Aa2=A.getFun();System.out.println(a1.getR());System.out.println(a2.getR());}}
解决方案
解决方案二:
引用楼主benbenyangdongxu的回复:
Aa=newA();//这个为什么有问题啊a=newA();这个为什么对啊?????
这里如果这样写,就是创建了一个临时变量a,下一行方法结束,变量就没了。结果是类中a成员变量中没有值。
解决方案三:
不好意思能不能细点啊
解决方案四:
引用楼主benbenyangdongxu的回复:
classA{privatestaticAa=null;publicstaticAgetFun(){if(a==null){Aa=newA();//这个为什么有问题啊a=newA();这个为什么对啊?????}returna;
还不够细?这样的,上面的A类定义了一个成员变量a,值是null。然后getFun()方法判断这个成员变量a是否是null,若是则实例化一个对象并赋值给这个成员变量,如果不是null则直接返回这个现成的a成员变量值。在if判断里面,如果写Aa=newA();意思是当场定义一个局部变量a并对其赋值,而成员变量a就没有能得到有效赋值,依然是null。if后面返回的结果就是null,导致main方法中空指针错。
解决方案五:
引用楼主benbenyangdongxu的回复:
publicstaticAgetFun(){if(a==null){Aa=newA();//这个为什么有问题……
问题在与你这里new的a是现在建立局部的变量,而不是刚才那个a。换成这样:if(a==null){a=newA();}
解决方案六:
classA的构造方法私有化以后是不能通过newA();创建对象
解决方案七:
引用楼主benbenyangdongxu的回复:
classA{privatestaticAa=null;doubler;privateA(){r=Math.random();}publicstaticAgetFun(){if(a==null){Aa=newA();//这个为什么有问题……
LZ首先你要自己搞清楚,你定义的构造方法为private的含义,其次,就是一个建议了,你应该下载一篇java的代码规范,仔细学一学,你的问题就能解决了。
解决方案八:
即便构造器为private,本类中依然可以用它来new本类的对象,构造器定义这个地方LZ的代码没有错。
解决方案九:
引用1楼magong的回复:
引用楼主benbenyangdongxu的回复:Aa=newA();//这个为什么有问题啊a=newA();这个为什么对啊?????这里如果这样写,就是创建了一个临时变量a,下一行方法结束,变量就没了。结果是类中a成员变量中没有值。
正解,学习了
解决方案十:
基础太不扎实了。连变量生命周期都整不明白,建议细读一本java基础书籍