java——值传递与引用传递

原创 2018年04月17日 12:15:44

基本数据类型int, float, double, byte等,这些基本数据类型都是值传递,形参在内存中新开辟了一个空间,把实参的值传过去,不管形参怎么样改变,都不会影响实参的值,并且在函数执行完毕之后,就会销毁形参,释放空间。

 

package com.test;

 

publicclass TestValue {

  

   privateinti = 0;

  

   publicstaticvoid main(String[] args) {

     

      inti = 1;

      test(i);

      System.out.println("i=" + i);

     

   }

  

   publicstaticvoid test(intval) {

      val = 0;

      System.out.println("val=" + val);

   }

 

}

 

输出结果为val=0

i=1

 

这里特别需要注意的是String字符串是一个类,但是不会改变值。

   publicstaticvoid main(String[] args) {

     

     

      String str = "aaa";

     

      if(strinstanceof Object) {

          System.out.println("true");

      }

 

打印出true

String源代码里面有这么一个段注释

* Strings are constant; theirvalues cannot be changed after they

 * are created. String buffers support mutablestrings.

 * Because String objects are immutable theycan be shared. For example:

 * <blockquote><pre>

 *    String str = "abc";

 * </pre></blockquote><p>

 * is equivalent to:

 * <blockquote><pre>

 *    char data[] = {'a', 'b', 'c'};

 *     String str = new String(data);

String类中有一个私有属性

private final char value[];

这个属性有final修饰符,String中用字符数组来存储字符串,一旦被初始化就不能被修改,所以String字符串不能被修改,即使是引用传递。

StringBuffere和StringBuilder是引用传递,可以修改,看下面的例子。

package com.test;

 

publicclass TestValue {

  

   privateinti = 0;

  

   publicstaticvoid main(String[] args) {

     

      StringBuffer str = new StringBuffer("aaa");

      test(str);

      System.out.println("str=" + str);

     

   }

  

   publicstaticvoid test(StringBuffer val) {

      val.append("sss"); //这个方法的作用是追加在字符串后面追加字符串

      System.out.println("val=" + val);

   }

 

}

Integer、Double等类型特殊处理,本质为引用传递,但是不能修改,可以理解为值传递。

下面看一下数组。

package com.test;

 

publicclass TestValue {

  

   privateinti = 0;

  

   publicstaticvoid main(String[] args) {

     

      int[] arr = {1,2};

      test(arr);

      System.out.println("arr=" + arr);

      System.out.println("arr=" + arr[0] + "-" + arr[1]);

     

   }

  

   publicstaticvoid test(int[] vals) {

      vals[0] = 9;

      System.out.println("vals=" + vals);

      System.out.println("arr=" + vals[0] + "-" + vals[1]);

   }

 

}

 

输出为vals=[I@7852e922

arr=9-2

arr=[I@7852e922

arr=9-2

从输出结果可以看到实参和形参指向的是同一个对象,比且修改成功,所以是引用传递。

下面来看类。

package com.test;

 

publicclass TestValue {

  

   publicinti = 0;

   publicintj = 0;

  

   publicstaticvoid main(String[] args) {

     

      TestValue testValue = new TestValue();

      test(testValue);

      System.out.println(testValue);

      System.out.println("testValue.i=" + testValue.i + "-testValue.j" + testValue.j);

     

   }

  

   publicstaticvoid test(TestValue t) {

      t.i = 10;

      t.j = 10;

      System.out.println(t);

      System.out.println("t.i=" + t.i + "-t.j" + t.j);

     

   }

 

}

输出结果

com.test.TestValue@7852e922

t.i=10-t.j10

com.test.TestValue@7852e922

testValue.i=10-testValue.j10

从输出结果来看形参和实参指向的同一个对象,并且变量修改成功,所以类是引用传参。

下面看类的另一种情况

package com.test;

 

publicclass TestValue {

  

   publicinti = 0;

   publicintj = 0;

  

   publicstaticvoid main(String[] args) {

     

      TestValue testValue = new TestValue();

      test(testValue);

      System.out.println(testValue);

      System.out.println("testValue.i=" + testValue.i + "-----testValue.j" + testValue.j);

     

   }

  

   publicstaticvoid test(TestValue t) {

      t = new TestValue();

      t.i = 100;

      t.j = 100;

     

      System.out.println(t);

      System.out.println("t.i=" + t.i + "------t.j=" + t.j);

   }

 

}

输出为

com.test.TestValue@7852e922

t.i=100------t.j=100

com.test.TestValue@4e25154f

testValue.i=0-----testValue.j0

在test方法中形参t被重新指向一个新的对象,但是实参并没有指向新的对象,要注意这里。

 

小结:

基本数据类型int,float等是值传递,修改形参不影响实参。

类、数组是引用传递,修改形影响实参。

String、Integer等可以理解为值传递,修改形参不影响实参。

但是StringBuffer与StringBuilder为引用传递,修改形参影响实参。

 

Java面向对象值传递和引用传递

  • 2011年07月20日 12:16
  • 28KB
  • 下载

java中按值传递和引用传递区别

java中传参方式
  • morgerton
  • morgerton
  • 2017-02-08 12:54:03
  • 3427

java值传递和引用传递 面试题

前言 某坑公司的面试题如下 我认真了想想,这无非就是Java 的值传递和引用传递,利用反射是可以做到的 反射public static void doSomethingReflect(Integ...
  • CSDNno
  • CSDNno
  • 2017-05-21 10:53:12
  • 1006

一个简单的例子让你理解值传递和引用传递

碰到一些做了好几年java开发的程序员还弄不清楚值传递和引用传递的区别,下面通过一个简单的例子来说明:public class Person { private String name; publi...
  • java_zys
  • java_zys
  • 2016-04-20 16:36:41
  • 3358

Java到底是值传递?还是引用传递?

前言 最近和同事讨论算法效率问题无意中涉及到一个问题,java中调用方法的时候是值传递呢?还是引用传递?网上搜索一下相关问题,众说纷纭,有人说值传递,有人说引用传递,还有人说”基础类型是值传递,对象...
  • xiaosha009
  • xiaosha009
  • 2016-02-17 14:23:43
  • 2173

Java中值传递和引用传递实例

Java中值传递和引用传递实例
  • u012273328
  • u012273328
  • 2016-04-15 12:05:10
  • 1584

JAVA中值传递和引用传递的三种情况

前言我们都知道,java中数据类型分为基本数据类型和引用数据类型。 基本数据类型 - 整型:byte,short,int,long - 浮点型:float,double ...
  • zhzhao999
  • zhzhao999
  • 2016-12-04 00:14:39
  • 6614

Java中只有值传递,没有引用传递

先来看一个作为程序员都熟悉的值传递的例子:... ... //定义了一个改变参数值的函数 public static void changeValue(int x) { x = x *2; } ......
  • qq_27258799
  • qq_27258799
  • 2016-05-17 21:50:57
  • 1432

java里的值传递和引用类型传递的经典面试题

/* * 面试题: * 1:String,StringBuffer,StringBuilder的区别? * A:String是内容不可变的,而StringBuffer,StringBuil...
  • wuxizhi777
  • wuxizhi777
  • 2016-06-04 23:17:56
  • 2097

关于Java的值传递和引用传递

结论: 1. 对于值传递,如int, long等基本类型,不管传入方法后怎么修改,都改变不了方法外面的值。 2. 对于引用传递,如果传入方法后指向了一个新的对象,那么无论怎么修改也改变不了方法外面...
  • scau_syd
  • scau_syd
  • 2016-09-19 19:55:47
  • 555
收藏助手
不良信息举报
您举报文章:java——值传递与引用传递
举报原因:
原因补充:

(最多只允许输入30个字)