迅雷笔试

虽然面试不太好。但是迅雷的笔试题中还是有一些基础题目是不错的。

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
类 Throwable

java.lang.Object
  java.lang.Throwable
所有已实现的接口:
Serializable
直接已知子类:
Error, Exception

从上面的这个继承关系可以看到,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这个值。

你可能感兴趣的:(迅雷笔试)