这个问题之前已经搞定了,奈何最近又有一点迷糊,特此总结一下。
这里有几种声明方式:
① String a = null;
② String b = "";
③ String e = "";
④ String c = new String("");
⑤ String d = new String();
⑥ String f;
①方式,声明了一个引用为a,并且将其初始化。值为null代表了a未指向任何对象。因此这条语句我们可以认为分2步去理解:第一,声明一个字符串类型的引用a;第二步,将这个引用初始化,并且让它不指向任何对象。(注意:这一步并没有在堆中创建对象)
②方式,声明了一个引用为b,并且将引用初始化之后指向值为“”的对象。这条语句可以分为三步去理解:第一步,声明一个字符串类型的引用b;第二步,在堆中创建一个值为“”的对象;第三步,将b初始化为指向第二步中创建的对象的引用。
③方式:同②。不过这里有涉及到常量池的相关内容。这里不再赘述。
④方式:同②,不过这里又重新创建了一个 值为“”的对象。
⑤方式:同②,不过新创建的对象值被初始化为“”;
⑥方式:这条语句只是声明了一个字符串类型的引用。仅此一步而已,并没有对该引用进行初始化。而在JAVA中是不允许内存未被初始化就被使用的,因此如果使用f会出现空指针异常。
另外,因为①和⑥方式均未创建对象,因此无法通过a和f调用String类的有关方法,否则会产生空指针异常。