请问各位大虾,
String s; 和 String s = null; 和String s = "a";有什么区别?
针对这三种情况,使用out.println(s);的时候,第一个会出现异常,第二个会输出null.第三个则会输出a.
这是为什么呢?
这三句声明语句,各自作了什么呢?
String s; 和 String s = null; 和String s = "a";有什么区别?
针对这三种情况,使用out.println(s);的时候,第一个会出现异常,第二个会输出null.第三个则会输出a.
这是为什么呢?
这三句声明语句,各自作了什么呢?
第一个是没有初始化的引用,
第2个为空引用,
最后一个是在字符串池里写入一个字符'a',然后用s指向它
String s = "a" 和 String s = new String("a");是有本质上的区别的
String s = new String("a");是在堆上创建一个内容为"a"的字符串对象
系统会自动赋值null
String s = null是分配的空间中存储的值为空值
String s = "a";这句就不用我多说了
分配的空间的值为字符a
系统会自动赋值null
怎么还会报错了?
只是分配了内存空间
String s=null;相当于String s=new String();
String s="a";相当于String s=new String("a");
String s = null ; 初始化了这个java中的特殊对象String。
String s = "a" ; 是s指向了字符串"a",但没有在堆中分配一块内存给s,s仍然是引用。
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必须显式地赋值.这些虽然是小知识点, 但在实际应用中很重要, 也很容易被一些人忽视, 特此提出.
这是一个严重的误解!null就是null, 不是其它任何东西!
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标志来生成对象,其实内容是一样的。谢谢!
不同意 jara(一怒拔剑) String str="aaa"; //于栈上分配内存
String str=new String("aaa"); //于堆上分配内存
那个out.println()又是怎么执行的呢?为什么它会输出null,而不是输出空白呢?
这个错误很严重!它们的区别很大的!还有一点要说明的是:只要是在方法在中定义变量都要显示赋初值,main()方法也不例外。而在方法之外编译器回自动赋初值。正如上面有为兄弟举的那个例子。