黑马程序员技术交流社区
标题: 关于初始化的问题 [打印本页]
作者: 清心玉质 时间: 2013-8-8 11:33
标题: 关于初始化的问题
本帖最后由 清心玉质 于 2013-8-8 13:00 编辑
两段代码,执行的时候会提示代码1中的a没有初始化,但是代码却能正常执行,为什么啊
代码1:
String a;
if(a==null)
代码2:
private static lanSingle s;
public static lanSingle getInstance(){
if(s==null)
s = new lanSingle();
return s;
}
作者: 李政 时间: 2013-8-8 11:40
定义变量的时候一定要定义它的初始值
定义变量的格式就是
类型 变量 = 初始化值;
但是作为类中的成员变量,都有默认的初始化值
比如
class
{
int x ;//这里即使不对x就行初始化,它的默认初始化值是0
}
作者: hoyouly 时间: 2013-8-8 11:47
String a ; 意思是你定义了一个String类型的引用,当然会报为初始化啊,因为你根本就没有初始化,只是定义了一个引用。
而代码2能正常运行,是因为static的缘故,这个是随着类的加载而加载的,优先于对象。
实例变量和类变量的区别:
(1) 存放位置不同,
类变量随着类的加载而存在于方法区(共享区/数据区),
实例变量随着对象的建立而存在于堆内存中
(2) 生命周期不同:
类变量生命周期最长,随着类的消失而消失
实例变量的生命周期随着变量的消失而消失。
作者: 清心玉质 时间: 2013-8-8 12:06
我没有明白为什么实例变量没有初始化就有null值。。。完整代码在下面:
class lSingle{
private lSingle(){}
private static lSingle s;
public static lSingle getInstance()
{
System.out.println("111111"+s);
if(s==null)
{
synchronized(lSingle .class)
{if(s==null)
s=new lSingle();
}
}
return s;
}
}
class lSingleDemo
{
public static void main(String[] args)
{
lSingle ls = lSingle.getInstance();
System.out.println(ls);
}
}
out:
111111null
SingleTest.lSingle@24c98b07
作者: 茶念小手 时间: 2013-8-8 12:21
变量都是有默认值得啊
作者: 王松松 时间: 2013-8-8 12:45
首先,变量定义在类中和类外部。
1,定义在类中,则变量会随着类对象的创建而默认初始化。
2,定义在类外,那么则变量需要显示初始化,因为java未经初始化的变量是不允许使用的。
希望对你有帮助。{:soso_e141:}
作者: 胡智 时间: 2013-8-8 12:52
本帖最后由 胡智 于 2013-8-8 16:28 编辑
这个看是什么变量,有的变量是有初始值的,有的是没有的。
成员变量:作用于类中的对象。因为对象的存在而存在,存在于堆内存中。有初始值,可以参与运算。
局部变量:作用于函数或者语句中。存在于栈内存中。这个没有初始值,需要你自己去赋予。
所以你代码1中a没有赋值,而代码2中的S本身有初始值null。所谓的实例变量也是成员变量,类变量是静态成员变量。
作者: 清心玉质 时间: 2013-8-8 12:59
是的,我看视频里就赋值null了~~ 谢谢大家
作者: 布易般 时间: 2013-8-8 14:00
这个问题问的很好,我原以为很简单,真的要回复的时候也蒙了一下。
1.String a;这句没有对变量进行初始化,所以会报错,这个我能理解。
2.代码2:private static lanSingle s; 这句也没有对s进行初始化为什么能用呢?确实很奇怪!经过反复研究,发现关键的问题出在前面的修饰符static上!
static变量,在类加载的时候就会对静态变量进行默认的初始化!
3.有图有真相
作者: 布易般 时间: 2013-8-8 14:01
本帖最后由 布易般 于 2013-8-8 14:04 编辑
不赋值null也是可以的,静态变量在加载的时候,会被系统自动初始化!
作者: 清心玉质 时间: 2013-8-8 14:57
多谢!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |