日期:2014-05-20 浏览次数:20899 次
/**
* <pre>
* @author kanpiaoxue
*
* 未初始化、空串""与null。它们是不同的概念。对未初始化的对象操作会被编译器挡在门外;null是一个特殊的初始化值,
* 是一个不指向任何对象的引用,对引用为null的对象操作会在运行时抛出异常NullPointerException;
* 而空串是长度为0的字符串,和别的字符串的唯一区别就是长度为0。
*
* 但是s1 s2 是怎么分配的?
* S1 S2 为什么一个为null 一个未初始化???
* </pre>
*/
public class StringTest {
/**
* <pre>
* s1在 StringTest.class 被JVM加载的时候,就被赋予了 null 值。
* s1 是 static ,也就是静态的类属性,会在 JVM 加载该类的时候进行初始化,如果没有指定初始化的具体值,将会被赋予默认值:null
*
* 例如:
* static int n1; //默认的初始化值: 0
* static long n1; //默认的初始化值: 0L
* static Date d1; //默认的初始化值: null
* </pre>
*/
static String s1;
public static void main(String[] args) {
/**
* <pre>
* 这里的 s2 是方法内的局部变量,在Java里面规定,局部变量一定要被“初始化”之后才能引用。局部变量是不会被编译器赋予默认值的。
* </pre>
*/
String s2;
/**
* <pre>
* s3 的这个局部变量,很明显被指定了初始化的数值,符合Java的规定,是不会报错的。
* </pre>
*/
String s3 = "";
/**
* <pre>
* isEmpty() 这个函数,你可以参考一下JDK的源码。可以清晰的看到
*
* public boolean isEmpty() {
* return count == 0;
* }
*
* 里面的 count,看过JDK的源码之后,知道它是组成String的字节的个数。
* </pre>
*/
System.out.print(s1.isEmpty()); // 运行时异常
System.out.print(s2.isEmpty()); // 编译出错 -- 在现有的Java的IDE里面,这是报错的,提醒你会有编译的错误。
System.out.print(s3.isEmpty()); // ok!输出true
}
}