虽然面试不太好。但是迅雷的笔试题中还是有一些基础题目是不错的。
1、交换StringBuffer引用
看代码:
package a; public class Test1 { public static void main(String s[]) { //第一个例子 StringBuffer sb1 = new StringBuffer(); sb1.append("a"); StringBuffer sb2 = new StringBuffer(); sb2.append("b"); op(sb1, sb2); System.out.println(sb1.toString()); System.out.println(sb2.toString()); //第二个例子 Stu a = new Stu(); a.age = 1; Stu b = new Stu(); b.age = 1; op(a, b); System.out.println(a.age); System.out.println(b.age); } public static void op(StringBuffer a, StringBuffer b) { a.append("c"); // b = a; b.append("test"); System.out.println("in op :" + b.toString()); b = a; System.out.println("in op :" + b.toString()); } public static void op(Stu a, Stu b) { a.age = 11; b.age = 12; b = a; } } class Stu { int age; }
这段代码的输出是:
in op :btest
in op :ac
ac
btest
11
12
-----------------------------------------------------------
这个输出让我很是震惊。
拿第二个例子来说,穿入两个stu的对象,让b指向a之后,那么在函数返回之后,输出b的内容,竟然还是b原来的内容而不是在op函数中所指向的a的内容了。
第一个例子也是这个问题。在b指向a之后,op函数返回之后,输出sb2的值,也是原来的值。
分析:
调用op函数的时候,实际执行函数的时候,参数又是另外一个引用了(虽然都是指向同一个对象,但是现在已经是两个不同的引用了)。那么在函数里面改变引用指向对象的时候,是不会改变函数外面的那个引用所指向的对象的。于是出现了输出那样的输出结果。【这个观点从第二个例子中就很容易的可以看出来】。
-----------------------
上面的这个例子要好好想一想。想通了之后,对于java传递参数的时候,引用的问题也就明白了。
-----------------------
2、switch语句,都可以用哪些变量作为参数?
int型以及能强制转换成int型的数据比如byte、short、char。
从提示的错误: Only convertible int values or enum constants are permitted,就可以看出来,只有能转换成int的或者是enum可以作为参数。【其实enum本身可以看做是int的】
3、能被throw的是什么?error?throwable?exception?
惊奇的发现,三者都能被抛出
public static void op() throws Throwable {
// throw new Throwable();
// throw new Error();
throw new Exception();
}
这三行代码都是可行的。而且都抛出了相应的异常,比如说java.lang.Throwable,java.lang.Error和Exception。
看来这三者都能被throw语句抛出的。
这里是由其继承关系来决定的。
java.lang.Object java.lang.Throwable
从上面的这个继承关系可以看到,Error和Exception都是Throwable的子类。
4、int $a;,这个变量名是有效的!int 9_b;,这个变量名是无效的。
5、float f=0x123;是有效的变量声明!
6、class A{int a;},这个类里面的a是在哪里初始化的?在看jvm的时候,看到这里。a是在jvm加载类的时候,在加载、准备、解析、初始化中的“准备阶段”被分配内存并设置变量初始值。由于a没有在声明的时候赋值,所以在初始化阶段就不对他赋其他值了。如果是class A{int a=6;},那么在初始化阶段,还要为a赋6这个值。