文档章节

java中值传递和引用传递

byronhs
 byronhs
发布于 2015/10/18 15:15
字数 741
阅读 114
收藏 7

最近去面试,笔试考这个的相当多,也比较基础,就总结一下。

 1.值传递

 在方法调用时,传递的参数是按值的拷贝传递。重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。

class test {
 public static class TempTest {
  private void test1(int a) {
   a = 5;
   System.out.println("test1方法中的a=" + a);
  }
 }
 public static void main(String[] args) {
  TempTest t = new TempTest();
  int a = 3;
  t.test1(a);// 传递后,test1方法对变量值的改变不影响这里的a
   System.out.println("main方法中的a="+a);
 }
}

结果:

test1方法中的a=5
main方法中的a=3

2.引用的传递

 在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址,这样当我们改变地址指向的值的时候,原来的指向内存地址中的值自然就改变了。 传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)

 class Ref2{
 String temp = "hello";
}
public class RefDemo03 {
 public static void main(String args[]){
  Ref2  r1 = new Ref2();
  r1.temp="main:nihao";
  System.out.println(r1.temp);
  tell(r1);
  System.out.println(r1.temp);
 }
 public static void tell(Ref2  r2){
  r2.temp="tell:hi";
 }
}

结果:

main:nihao
tell:hi

3.特别的,在java中String类是字符串常量,是不可更改的常量,而StringBuffer是字符串变量,它的对象时可以扩充和修改的。所以会出现下面这种情况

public class RefDemo02 {
 public static void main(String args[]) {
  String str1 = "Hello";
//  String str1 = new String("hello");
  System.out.println(str1);
  tell(str1);
  System.out.println(str1);
 }
 public static void tell(String str2){
  str2+="tell";
 }
}

结果:

Hello
Hello

这里创建了二个String对象,所以原来的引用并没有改变,还是hello。但是对于StringBuffer确不一样

 public class RefDemo02 {
 
 public static void main(String args[]) {
  StringBuffer sb = new StringBuffer("hello");
  System.out.println(sb);
  tell(sb);
  System.out.println(sb);
 }
 public static void tell(StringBuffer str2){
  str2.append("tell");
 }
}

结果:

hello
hellotell

这里只不过创建了一个StringBuffer的变量,二个都指向同一个,改变了自然就能生效。

String为什么会出现这种情况,我的猜想是因为String是通过char[]来实现的,类似与Integer是int的包装类,String 也相当于是char[]的包装类,包装类在对其值操作时会出现对其对应基本类型的性质 ,传递参数的时候就是这样体现的。同样Integer,Float等这些包装类和String表现是一样的,看代码

 public class test2 {
 public static void main(String[] arg) {
  // Integer i = 9;
  Integer i = new Integer(9);
  System.out.println(i);
  test(i);
  System.out.println(i);
 }
 public static void test(Integer i) {
  i = 11;
 }
}

结果:

9

9

我还是新手,所有代码都是实际运行后的,结果没有问题。不过不知道后面这样猜想对不对,这方面有了解的求指导,博客里面有任何有错误请指出,谢谢!

© 著作权归作者所有

共有 人打赏支持
byronhs
粉丝 3
博文 32
码字总数 15993
作品 0
武汉
程序员
Java的方法传递参数的本质---值传递

JAVA中只有值传递,没有引用传递 任何数据(不管是基本类型,还是引用类型)传到一个方法里时,都是拷贝了一份,所以无法在一个方法里修改他们的值,当然,如果传递的是对象的话,也就是引用...

Zhao-Qian
2012/10/18
0
2
java方法参数和C方法参数的区别

方法调用(call by) 是一个标准的计算机科学术语。方法调用根据参数传递的情况又分为值调用( call by reference ) 和引用调用( call by value ) 。江湖上有很多关于这两种调用的定义 ,最通常...

墙头草
2011/09/09
0
0
JVM基础:深入学习JVM堆与JVM栈

以前堆是干啥栈是干啥都知道,就是没连在一起想想。感觉讲的不错的一篇儿~~JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在...

李星
2014/06/04
0
0
java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

答:是值传递。Java编程语言只有值传递参数。 当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对...

黑泽明军
04/02
0
0
最最最常见的Java面试题总结-第一周

这里会分享一些出现频率极其极其高的面试题,初定周更一篇,什么时候更完什么时候停止。 Github地址:https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/最最最常见的Java面试...

Amsour丶
08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arcgis jsapi接口入门系列:总览

开发环境: arcgis jsapi版本4.9 由于我们这套代码是基于vue,webpack开发的,会有少数vue代码,但总体不影响 里面还有些我们公司的js库和html css,给出的代码不能百分百直接运行,主要还是...

canneljls
25分钟前
1
0
月薪80k阿里架构师漫谈他是如何从一名小码农走到架构师的

01 刚当程序员时,我是属于那种勤勤恳恳类型的员工,工作态度用认真来形容不为过,每天我几乎是团队里最早到公司,又最晚下班的一个。而组员张工一般情况下都是准时上下班的,即使项目进度比...

Java填坑之路
27分钟前
1
0
oracle的resetlogs机制浅析

oracle的resetlogs机制浅析 alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用? 它的原理机制是什么?他都起哪些作用? 我...

突突突酱
28分钟前
1
0
JAVA 获取两个日期间的所有日期

public static List<String> getDates(String startDate, String endDate){ List<String> dates = new ArrayList<>(); try { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Dat......

尘叙缘
35分钟前
2
0
Innodb中的事务隔离级别和锁的关系

#一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。...

Skqing
49分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部