A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 清心玉质 中级黑马   /  2013-8-8 11:33  /  2054 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 清心玉质 于 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;
}

10 个回复

倒序浏览
定义变量的时候一定要定义它的初始值
定义变量的格式就是

类型 变量 = 初始化值;

但是作为类中的成员变量,都有默认的初始化值

比如
class
{
int x ;//这里即使不对x就行初始化,它的默认初始化值是0
}
回复 使用道具 举报
String  a ; 意思是你定义了一个String类型的引用,当然会报为初始化啊,因为你根本就没有初始化,只是定义了一个引用。
而代码2能正常运行,是因为static的缘故,这个是随着类的加载而加载的,优先于对象。

实例变量和类变量的区别:
(1)        存放位置不同,
类变量随着类的加载而存在于方法区(共享区/数据区),
实例变量随着对象的建立而存在于堆内存中
(2)        生命周期不同:
类变量生命周期最长,随着类的消失而消失
实例变量的生命周期随着变量的消失而消失。

回复 使用道具 举报
我没有明白为什么实例变量没有初始化就有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
回复 使用道具 举报
变量都是有默认值得啊
回复 使用道具 举报
首先,变量定义在类中和类外部。
1,定义在类中,则变量会随着类对象的创建而默认初始化。
2,定义在类外,那么则变量需要显示初始化,因为java未经初始化的变量是不允许使用的。

希望对你有帮助。{:soso_e141:}
回复 使用道具 举报
本帖最后由 胡智 于 2013-8-8 16:28 编辑

这个看是什么变量,有的变量是有初始值的,有的是没有的。
成员变量:作用于类中的对象。因为对象的存在而存在,存在于堆内存中。有初始值,可以参与运算。
局部变量:作用于函数或者语句中。存在于栈内存中。这个没有初始值,需要你自己去赋予。
所以你代码1中a没有赋值,而代码2中的S本身有初始值null。所谓的实例变量也是成员变量,类变量是静态成员变量。

回复 使用道具 举报
是的,我看视频里就赋值null了~~ 谢谢大家
回复 使用道具 举报
这个问题问的很好,我原以为很简单,真的要回复的时候也蒙了一下。

1.String a;这句没有对变量进行初始化,所以会报错,这个我能理解。

2.代码2:private static lanSingle s;  这句也没有对s进行初始化为什么能用呢?确实很奇怪!经过反复研究,发现关键的问题出在前面的修饰符static上!

       static变量,在类加载的时候就会对静态变量进行默认的初始化!

3.有图有真相

回复 使用道具 举报
本帖最后由 布易般 于 2013-8-8 14:04 编辑
清心玉质 发表于 2013-8-8 12:59
是的,我看视频里就赋值null了~~ 谢谢大家


不赋值null也是可以的,静态变量在加载的时候,会被系统自动初始化!
回复 使用道具 举报
布易般 发表于 2013-8-8 14:01
不赋值null也是可以的,静态变量在加载的时候,会被系统自动初始化!

多谢!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马