java中参数传递讲解(值传递和引用传递)
发布日期:2021-10-17 04:13:21 浏览次数:2 分类:技术文章

本文共 2817 字,大约阅读时间需要 9 分钟。

java中参数传递讲解(值传递和引用传递)

参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。

在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。

 

Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的;没有一种按引用传递。

 

按值传递和按引用传递。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。

1、对象是按引用传递的
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本

首先考试大来看看第一点:对象是按引用传递的
  确实,这一点我想大家没有任何疑问,例如:
  class Test01
  {


  public static void main(String[] args)
  {

  StringBuffer s= new StringBuffer("good");
  StringBuffer s2=s;
  s2.append(" afternoon.");
  System.out.println(s);
  }
  }
  对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。
  如何解释“对象是按引用传递的”的呢?
  这里的意思是进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的,有问题吗?
  程序运行的输出是:
  good afternoon.
  这说明s2和s是同一个对象。
  这里有一点要澄清的是,这里的传对象其实也是传值,因为对象就是一个指针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值)
  再看看下面的例子:
  class Test02
  {

  public static void main(String[] args)
  {

  int i=5;
  int i2=i;
  i2=6;
  System.out.println(i);
  }
  }
  程序的结果是什么?5!!!
  这说明什么,原始数据类型是按值传递的,这个按值传递也是指的是进行赋值时的行为下一个问题:Java 应用程序有且仅有的一种参数传递机制,即按值传递
  class Test03
  {

  public static void main(String[] args)
  {

  StringBuffer s= new StringBuffer("good");
  StringBuffer s2=new StringBuffer("bad");
  test(s,s2);
  System.out.println(s);//9
  System.out.println(s2);//10
  }
  static void test(StringBuffer s,StringBuffer s2) {

  System.out.println(s);//1
  System.out.println(s2);//2
  s2=s;//3
  s=new StringBuffer("new");//4
  System.out.println(s);//5
  System.out.println(s2);//6
  s.append("hah");//7
  s2.append("hah");//8
  }
  }
  程序的输出是:
  good
  bad
  new
  good
  goodhah
  bad
  考试大提示: 为什么输出是这样的?
  这里需要强调的是“参数传递机制”,它是与赋值语句时的传递机制的不同。
  我们看到1,2处的输出与我们的预计是完全匹配的
  3将s2指向s,4将s指向一个新的对象
  因此5的输出打印的是新创建的对象的内容,而6打印的原来的s的内容
  7和8两个地方修改对象内容,但是9和10的输出为什么是那样的呢?
  Java 应用程序有且仅有的一种参数传递机制,即按值传递。
  至此,我想总结一下我对这个问题的最后的看法和我认为可以帮助大家理解的一种方法:
  我们可以将java中的对象理解为c/c++中的指针
  例如在c/c++中:
  int *p;
  print(p);//1
  *p=5;
  print(*p);//2
  1打印的结果是什么,一个16进制的地址,2打印的结果是什么?5,也就是指针指向的内容。
  即使在c/c++中,这个指针其实也是一个32位的整数,我们可以理解我一个long型的值。
  而在java中一个对象s是什么,同样也是一个指针,也是一个int型的整数(对于JVM而言),我们在直接使用(即s2=s这样的情况,但是对于System.out.print(s)这种情况例外,因为它实际上被晃猄ystem.out.print(s.toString()))对象时它是一个int的整数,这个可以同时解释赋值的传引用和传参数时的传值(在这两种情况下都是直接使用),而我们在s.XXX这样的情况下时s其实就是c/c++中的*s这样的使用了。这种在不同的使用情况下出现不同的结果是java为我们做的一种简化,但是对于c/c++程序员可能是一种误导。java中有很多中这种根据上下文进行自动识别和处理的情况,下面是一个有点极端的情况:
  class t
  {

  public static String t="t";
  public static void main(String[] args)
  {

  t t =new t();
  t.t();
  }
  static void t() {

  System.out.println(t);
  }
  }

1.对象就是传引用
2.原始类型就是传值
3.String类型因为没有提供自身修改的函数,每次操作都是新生成一个String对象,所以要特殊对待。可以认为是传值。

转载地址:https://blog.csdn.net/Sun_P0/article/details/50111123 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java不定参数"..."详解
下一篇:XShell配色方案(总结)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月15日 10时44分06秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【图解】拥塞控制 2019-04-27
线程上下文切换 2019-04-27
什么是服务熔断? 2019-04-27
服务器压力过大?CPU打满?我来帮你快速检查Linux服务器性能 2019-04-27
C++面经总结之《Effective C++》(一) 2019-04-27
C++面经总结之《Effective C++》(二) 2019-04-27
这是什么“虎狼之词”啊!!!程序员的健康问题,看一线老中医怎么说!!! 2019-04-27
打开我的收藏夹 -- Python数据分析杂谈 2019-04-27
上手Pandas,带你玩转数据(1)-- 实例详解pandas数据结构 2019-04-27
上手Pandas,带你玩转数据(2)-- 使用pandas从多种文件中读取数据 2019-04-27
上手Pandas,带你玩转数据(3)-- pandas数据存入文件 2019-04-27
爬虫遇上不让右击、不让F12的网站,该怎么办? 2019-04-27
上手Pandas,带你玩转数据(4)-- 数据清洗 2019-04-27
上手Pandas,带你玩转数据(5)-- 数据转换与数据定位 2019-04-27
上手Pandas,带你玩转数据(6)-- 摆脱对pandas可视化丑图的刻板印象吧 2019-04-27
从零开始,学会Python爬虫不再难!!! -- (1)开篇:初识爬虫,基础铺垫 丨蓄力计划 2019-04-27
从零开始,学会Python爬虫不再难!!! -- (2)承接:解析网页,抓取标签 丨蓄力计划 2019-04-27
AttributeError: module ‘urllib‘ has no attribute ‘quote‘的解决办法 2019-04-27
linux shell — 6.初识 EXT2 文件系统 2019-04-27
Java — String(字符串) 2019-04-27