本文主要是介绍java方法传参方式---到底是传值还是传址,还是两者都不对!!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天刚好领导写了几个面试新人的基础题,其中就有一道涉及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基础题目)
这篇关于java方法传参方式---到底是传值还是传址,还是两者都不对!!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!