请问各位大虾,
String s; 和 String s = null; 和String s = "a";有什么区别?
针对这三种情况,使用out.println(s);的时候,第一个会出现异常,第二个会输出null.第三个则会输出a.
这是为什么呢?
这三句声明语句,各自作了什么呢?

解决方案 »

  1.   

    第一个只是定义了一个String类型变量s,并没有给它赋初值,在Java中,默认在使用一个变量的时候必须赋予它初值(降低风险)。第二个和第三个都定义了String类型变量s,并赋予它初值,只不过第二个赋予的值为null(空)罢了
      

  2.   

    主要要理解的是String s;  s为一个引用~~它不是对象
    第一个是没有初始化的引用,
    第2个为空引用,
    最后一个是在字符串池里写入一个字符'a',然后用s指向它
    String s = "a" 和 String s = new String("a");是有本质上的区别的
    String s = new String("a");是在堆上创建一个内容为"a"的字符串对象
      

  3.   

    String s;
     系统会自动赋值null
      

  4.   

    String s 是给s分配一个内存空间
    String s = null是分配的空间中存储的值为空值
    String s = "a";这句就不用我多说了
    分配的空间的值为字符a
      

  5.   

    String s;
     系统会自动赋值null
    怎么还会报错了?
      

  6.   

    String s;
    只是分配了内存空间
      

  7.   

    String s;声明但没有分配内存空间。
    String s=null;相当于String s=new String();
    String s="a";相当于String s=new String("a");
      

  8.   

    String s ; 并没有在堆中分配内存空间,只是取得了一个指向String对象的引用。
    String s = null ; 初始化了这个java中的特殊对象String。
    String s = "a" ; 是s指向了字符串"a",但没有在堆中分配一块内存给s,s仍然是引用。
      

  9.   

    马上又有人要来说这是"垃圾问题"了, 呵呵.楼上诸位虽然说了不少, 但有个关键的一点, 没有人说到. 这就是:
    String s;在什么情况下可以等同于String s = null; 而在什么情况下又不等同.考虑下面的代码://StringTest.javapublic class StringTest {  static String s;  //*  public static void main(String[] args) {
        //String s;    //**
        System.out.println(s);
      }} 编译并运行上面的代码, 将打印null. 可见标有*号的行是自动初始化了的(s被自动初始化为null).而如果把标有**号的行取消注释, 代码将不能通过编译, 这是因为这行定义的是本地变量, 而本地变量是不会自动初始化的.因此在成员变量的定义中, String s; 等同于String s = null; 而在本地变量(方法变量)的定义中, String s; 不等同于String s = null;, 这时要使用s必须显式地赋值.这些虽然是小知识点, 但在实际应用中很重要, 也很容易被一些人忽视, 特此提出.
      

  10.   

    还需更正楼上一些人的观点.String s = null;这时的s不是String!!!! 更不可能像jsjzzh(蚯蚓) 说的, 相当于new String()!!!
    这是一个严重的误解!null就是null, 不是其它任何东西!
      

  11.   

    更正一下 smlovetp(IT菜鸟) 的回答:
    String s = "a" 和 String s = new String("a");是有本质上的区别的
    String s = new String("a");是在堆上创建一个内容为"a"的字符串对象注意:
    String s="a"相当于String s = new String("a");
    String在java中并不是基本类型。所以也是在堆上创建对象的,只不过比较特殊,可以不用new标志来生成对象,其实内容是一样的。谢谢!
      

  12.   

    再次更正一下楼上:String s = "a" 与String s = new String("a")是不同的!讨论过很多遍了,如果还不清楚的话,请搜索以前的贴子。
      

  13.   

    同意 Dan1980(也该有一些作为了)
    不同意 jara(一怒拔剑) String str="aaa";            //于栈上分配内存
    String str=new String("aaa");       //于堆上分配内存
      

  14.   

    我想知道的是到底哪个是分配了内存空间的?
    那个out.println()又是怎么执行的呢?为什么它会输出null,而不是输出空白呢?
      

  15.   

    String s="a"相当于String s = new String("a");
    这个错误很严重!它们的区别很大的!还有一点要说明的是:只要是在方法在中定义变量都要显示赋初值,main()方法也不例外。而在方法之外编译器回自动赋初值。正如上面有为兄弟举的那个例子。