JAVA中参数传递的概念

来源:互联网 发布:为知笔记本地部署 编辑:程序博客网 时间:2024/06/03 12:29

在java开发中,频繁的会用到参数传递的时候,有时候发现值发生了变化,有时候发现值却没有改变,究其原因原来java中参数传递虽然是值传递,

但值传递也分两种的:

1、按值传递(by value)

适用范围:8种基本数据类型、String对象

特点:在内存中复制一份数据,把复制后的数据传递到方法内部

作用:在方法内改变参数的值,外部的数据不会跟着发生改变

2、按引用地址传递(by address)

适应范围:数组、Object对象(除String以外)

特点:将对象的引用地址传递到方法的内部

作用:在方法内部修改对象的内容后,外部的数据也会跟着发生变化

示例代码:

package test;
/***
 * 测试JAVA中参数传递的变化:
 * JAVA的参数传递总是传"值",
 * 但是传值方式也分为两种方式,它们是靠传递参数的类型区分的。
 * 这两种类型分别为:JAVA的基础类型和Object(对象)类型;
 * 基础类型包括boolean,byte,short,char,int,long,float,double,而Object就是对象
 * @author harver
 *
 */
public class ParameterPass {
 public static void main(String[] args) {
  int[] a = {1, 2};
  test(a[0], a[1]);
  System.out.println("a[0]:" + a[0] + ",a[1]:" + a[1]);//a[0]:1,a[1]:2
  test2(a);
  System.out.println("a[0]:" + a[0] + ",a[1]:" + a[1]);//a[0]:2,a[1]:1
  int[] b = new int[1];
  b[0] = 3;
  test3(b);
  System.out.println("b[0]:" + b[0]);//b[0]:2
  int[] c = new int[1];
  c[0] = 3;
  test4(c);
  System.out.println("c[0]:" + c[0]);//c[0]:3
  test5(c);
  System.out.println("c[0]:" + c[0]);//c[0]:4
 }

 private static void test(int i, int j) {
  int temp = i;
  i = j;
  j = temp;
 }
 
 private static void test2(int[] a) {
  int temp = a[0];
  a[0] = a[1];
  a[1] = temp;
 }
 
 private static void test3(int[] b) {
  b[0]--;
 }
 //hashCode不一致,代表所引用堆中的地址值发生了变化.
 private static void test4(int[] c) {
  //System.out.println(c.hashCode());
  c = new int[1];
  //System.out.println(c.hashCode());
  c[0] = 4;
 }
 //hashCode一致,代表所引用堆中的地址值是同一地址.
 private static void test5(int[] c) {
  //System.out.println(c.hashCode());
  c[0] = 4;
  //System.out.println(c.hashCode());
 }
}

对于是不是同一个对象,可以在方法内部比较下传递进来的对象的hashcode值与修改数据之后的hashcode值是否相等,

如果相等,说明是引用的同一个对象。不相等,则方法内部修改的数据内容就不会影响到了外部的数据

原创粉丝点击