16、String str = new String("xyz"); 创建了几个String Object?一个或两个。"xyz"对应一个对象,这个对象放在字符串常量缓冲区(也就是常量池),常量"xyz"不管出现多少遍,都是缓冲区中的那一个。如果以前没有用过"xyz",那么就会创建一个丢进常量池,如果以前用过的话,常量池中就有了,不用在创建了。new String也创建出来一个对象。所以是一个或两个。
17、StringBuffer与StringBuilder的区别?StringBuffer和StringBuilder都是可变长字符串,StringBuffer效率底,线程安全,StringBuilder效率高,线程不安全。如果要在一个方法里面定义可变长字符串,那么选取StringBuilder,因为只可能有一个线程访问它,不存在线程安不安全的问题。如果要定义类的成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。 18、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";1个。也许觉得很奇怪,为什么是一个呢?先看下面的一个例子:
[java] view plaincopy
- String s1 = "a";
- String s2 = s1 + "b";
- String s3 = "a" + "b";
- System.out.println(s2 == "ab");
- System.out.println(s3 == "ab");
打印结果:
false true 这说明:javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。 也就是说:String s3 = "a" + "b";就相当于String s3 = "ab"; 所以String s="a"+"b"+"c"+"d";就相当于String s="abcd";,只创建了一个对象。 19、下面的程序代码输出的结果是多少?
[java] view plaincopy
- public class Test {
- public static void main(String[] args) {
- System.out.println(test());
- }
-
- private static int test() {
- try {
- return 1;
- } finally {
- return 2;
- }
- }
- }
答案:2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中。
20、Java中父类和子类强转的问题public class A {
public static void main(String[] args){
A a = new A();
B b = (B)a; //执行该语句会抛ClassCastException异常。
B b2 = new B();
a = (A)b2;
System.out.println("success");
}
}
class B extends A{
}
子类由于比父类拥有了更多的特性,所以当你想将父类强制转化为其一个子类的时候,编译没有错误,但在运行时就会抛异常。反之,则可以。
这就是所谓的向上转型,多态。
|