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基础题目)


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值