今天刚好领导写了几个面试新人的基础题,其中就有一道涉及java方法传值的题目,其实这个问题不仅对一些新人有难度,甚至可能对一些工作了好多年的人都搞不清楚,今天我就在这里简单的和大家分享下.
题目如下:
package com.eden.coreLearn.javacore;
import java.util.Arrays;
/**
* 类Parameter.java的实现描述:TODO 类实现描述 <br>
* 测试java的传参方式(到底是传值还是传址)
*
* @author wangding_91@163.com 2016年3月10日 下午10:05:53
*/
public class Parameter {
static void exchange(String str2) {
str2 = "cde";
}
static void exchange(int i) {
i = 1;
}
static void exchange(char[] c) {
c[0] = 'd';
}
public static void main(String[] args) {
char[] a = new char[] { 'g', 'o', 'o', 'd' };
int j = 0;
String str1 = "abc";
exchange(str1);
exchange(a);
exchange(j);
System.out.println("str1=" + str1);
System.out.println("a=" + Arrays.toString(a));
System.out.println("j=" + j);
}
}
代码非常简单,然后要求说出输出结果。。。估计好多人咋一看,直接懵逼了!!!
先告诉大家结果:
str1=abc
a=[d, o, o, d]
j=0
从结果来看,只有数组a的值被改掉了,其他两个值都没被改掉,来分析下:
首先看str1
1:首先str2被初始化为str1的一个拷贝,str2和str1都是指向常量池中"abc"常量的引用
2:然后将str2指向新的常量"cde",但是和str1毛关系都没有
3:方法结束,str2被回收,str1的值不会有任何改变
再看char[] a
1:同样的char[] c初始化为new char['g','o','o','d']的引用char[] a的一个拷贝,即c和a指向同一个对象
2:利用c改了c指向的数组中的第一个元素,而a也是指向的这个数组
3:方法结束,c回收,而a指向的数组已经被改了,所以a能看见
int j就不说了,只是int是基本类型,这是不是引用的拷贝而是j本身的拷贝
总结:
1:一个方法不能修改一个基本数据类型的参数
2:一个方法可以改变一个对象的状态(属性)
3:一个方法不能实现让对象参数引用一个新的对象
TODO
String str = new String("123");这句话创建了几个对象????
Integer i1 = new Integer(1);
Integer i2 = Integer.valueOf(1);
Integer i3 = Integer.valueOf(1);
System.out.println(i1==i2+"---------------"+i2==i3); 结果打印什么???
这些就留给大家自己想想好了,O(∩_∩)O哈哈~(都是常见的java基础题目)