自2010年起,Google和甲骨文一直就Android系统是否侵犯甲骨文的版权和专利争论不休。其实双方的争论点倒不是Google是否在 Android 中使用了Java APIs,Google对此也没有否定,因为这样能让数百万的开发者为自己开发应用程式。Google的论点是,APIs不能有版权,它本来就是用来让应用程式间相互交流,而很多公司也会让开发者自由使用。甲骨文对此的态度当然是我不听、我不听、我不听。
最终联邦陪审团裁定Android操作系统并未侵犯甲骨文的版本,37个Java API是正常使用。Android程序员开始喷甲骨文,并庆幸我们的饭碗保住了。
回到面试上,今天聊一下和Java相关的面试题。没错总有那么一些公司在招Android程序员时,比较侧重考察Java基础和能力的。Java的值传递和引用传递问题,相信很多人都被问题过,当然很多时候面试官都不会这么直白的问,他们会给你设计一个方法让你给出执行这个方法后的输出结果。
面试题: Java的值传递和引用传递问题
看过一些Java教材的话,对这句话应该不陌生:
“在Java里面参数传递都是按值传递”
这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
简单的说,基本类型是按值传递的,方法的实参是一个原值的复本。类对象是按对象的引用地址(内存地址)传递地址的值,那么在方法内对这个对象进行修改是会直接反应在原对象上的(或者说这两个引用指向同一内存地址)。不过要注意String这个类型,如下代码:
public static void main(String[] args) {
String x = new String("goeasyway");
change(x);
System.out.println(x);
}
public static void change(String x) {
x = "even";
}
可以自己思考一下会输出什么结果,为什么。String的对象是不可修改的,如果真正要达到改变字符串的效果,我们需要使用StringBuilder来替代String。
结论
很遗憾,我在实际中发现很多人都不会去重视基础问题,保括一些资深的开发也不太清楚Java还有这两种区分。在之前我呆过的一家公司,有一位女程序员直接在代码里使用一个未经声明的方法,并给这个方法传参数,然后来问我为什么编译不过呢。但这却不妨碍她仍然可以为客户解决问题,可以获得组内的最佳员工评选。所以有很多人并不重视基础的问题,总认为不知道也无防,用的时候有问题自然会报出来,到时候再解决就好了,你知道的也没比我多能耐。我只能说,知道的话确实不比别人多能耐,只是多了一份从容。
网友评论
对于String这种不可变对象,形参对其重新赋值,实际是将形参引用重新指向了一个新的地址。实参仍然指向旧地址。
```
public class TestString {
public static String x ;
public static void main(String[] args) {
x = "goeasyway";
x = change(x);
System.out.println(x);
}
public static String change(String x){
x = "even";
return x;
}
}
```
值传递只改形参。
引用传递修改了引用方向,也就不持有原来的引用了,也不会影响到原来的值。
怎么写 有没有大神教一下?
private void change(StringBuilder x) {
x.delete(0,x.length());
x.append("even");
}