黑马程序员技术交流社区

标题: 关于初始化的问题 [打印本页]

作者: 清心玉质    时间: 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 编辑
清心玉质 发表于 2013-8-8 12:59
是的,我看视频里就赋值null了~~ 谢谢大家


不赋值null也是可以的,静态变量在加载的时候,会被系统自动初始化!
作者: 清心玉质    时间: 2013-8-8 14:57
布易般 发表于 2013-8-8 14:01
不赋值null也是可以的,静态变量在加载的时候,会被系统自动初始化!

多谢!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2