Java传引用问题

 使用Java调用方法时,可以传值,也可以传引用。下面说说两者的区别:

1.传值

  1. 传值中的“值”类型是指java8大基本类型(基础知识,不知道请自行谷歌)。使用java传值是把实参的值传递给形参,但是对形参所做的任何改变都对实参没有影响。例如以下代码:
  1. public Class Demo{
  2. public static void test(int x){
  3. x++;
  4. System.out.println("方法内,x == "+x);
  5. }
  6. public static void main(String[] args){
  7. int a = 3;
  8. Demo.test(a);
  9. System.out.println("方法外,a == "+a);
  10. }
  11. }

运行结果:

方法内,x == 4

方法外,a == 3

  1. 解析:尽管x的值已经加1变成了4,但是当test()方法执行结束后,x就被销毁了,其值不能传回给实参a。学过C的应该知道:向方法中传值是单向的,只能由形参传给实参,不能反过来。在java中亦如此。所以改变形参的值对实参没有影响。

2.传引用

A.在方法内改变引用的指向

  1. 如下代码:
  1. public class Test {
  2. public static void main(String[] args) {
  3. Integer a = 20;
  4. System.out.println("修改前:" + a);
  5. TestStudent.modify(a, 900);
  6. System.out.println("修改后:" + a);
  7. }
  8. public static <T> void modify(T a, T b) {
  9. a = b;
  10. }
  11. }

运行结果:

修改前:20

修改后:20

  1. 虽然在modify()方法中将a指向了b,但是在方法结束后,modify()方法内的ab都被销毁了,对main()方法内的实参没有影响。modify()方法只是改变了形参的指向,并未改变实参的指向。如图:

  1. main()方法中的amodify()方法中的a都指向堆中的同一个对象,但是改变modify()方法中的a的指向对main()方法中的a的指向并没有影响,所以一切都是白费的。

B.在方法内改变引用的对象的属性

  1. 倘若在被调用方法内部改变了形参变量引用的对象的属性,会对实参变量引用的对象产生影响。因为形参变量和实参变量引用的是堆中的同一个对象。看下面一个例子:
  2. Student类:
  1. public class Student {
  2. public Student() {
  3. }
  4. public Student(String name, String sex, String tel) {
  5. super();
  6. this.name = name;
  7. this.sex = sex;
  8. this.tel = tel;
  9. }
  10. private String name;
  11. private String sex;
  12. private String tel;
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getSex() {
  20. return sex;
  21. }
  22. public void setSex(String sex) {
  23. this.sex = sex;
  24. }
  25. public String getTel() {
  26. return tel;
  27. }
  28. @Override
  29. public String toString() {
  30. return "Student [name=" + name + ", sex=" + sex + ", tel=" + tel + "]";
  31. }
  32. public void setTel(String tel) {
  33. this.tel = tel;
  34. }
  35. }
  1. Test类:
  1. public class TestStudent {
  2. public static void main(String[] args) {
  3. Student s = new Student("Obama", "Male", "10256905");
  4. Student student = new Student("Bill", "Female", "10256905");
  5. System.out.println(" 修改属性");
  6. System.out.println("修改前:" + s);
  7. TestStudent.test(s, "Jeff");
  8. System.out.println("修改后:" + s);
  9. System.out.println("\n 修改指向");
  10. System.out.println("\n修改前:" + s);
  11. TestStudent.modify(s, student);
  12. System.out.println("修改后:" + s);
  13. }
  14. public static void test(Student s, String name) {
  15. s.setName(name);
  16. }
  17. public static <T> void modify(T a, T b) {
  18. a = b;
  19. }
  20. }

运行结果:

  1. 修改属性

修改前:Student [name=Obama, sex=Male, tel=10256905]

修改后:Student [name=Jeff, sex=Male, tel=10256905]

  1. 修改指向

修改前:Student [name=Jeff, sex=Male, tel=10256905]

修改后:Student [name=Jeff, sex=Male, tel=10256905]

  1. 从运行结果可以看出,调用方法改变形参的指向对实参并没有影响。但是如果试图改变形参所指向的对象的属性会对实参所指向的对象产生影响。
  2. 综上所述:只有在调用方法内改变引用变量所引用的对象的属性才会对调用方法中的对象产生影响。因为形参变量和实参变量指向堆中的同一个对象。
  3. ps:第一次写技术博客,有不足处还望大家指出来,以后我会慢慢改进。谢谢大家的支持。

Java传引用问题的更多相关文章

  1. 我终于忍不住喷一下某些书了,关于Java传引用的XX言论

    凡是说Java对象传的是引用,简直一派胡言,尤其误导我这种Java初学者,更严重的是以前用过C++的Java初学者. 我们都知道Java建立对象一般都是需要这样的格式: Object obj = ne ...

  2. java集合中的传值和传引用

    在学习java集合过程中发现了传值和传引用的区别: 我们来看下面两句话 ●java集合就像一种容器,我们可以把多个对象(实际上是对象的引用),丢进该容器.(来自疯狂java讲义) ●当使用Iterat ...

  3. java中的传值与传引用

    java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中 ...

  4. Java是传值还是传引用

    http://www.bccn.net/Article/kfyy/java/jszl/200601/3069.html 对于基本数据类型(整型.浮点型.字符型.布尔型等),传值;对于引用类型(对象.数 ...

  5. Java中传值与传引用

    不管Java参数类型是什么,一律传递参数的副本. <Thinking In Java>:“When you're passing primitives into a method,you ...

  6. java 函数形参传值和传引用的区别

    java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...

  7. java传值和传引用区别

    1. 在java中所有的参数都是传值的,引用符号&的传递是C++中才有的:2. 在java传参中,基本类型(byte--short--int--long--float--double--boo ...

  8. Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题 ...

  9. Java:传值还是传引用?

    这是一个Java的经典问题,大部分人从C,C++语言入门,C语言有三种传递方式:值传递,地址传递和引用传递.详细的对C语言指针,引用的我个人的理解,见链接. Java所有操作都是传值操作!都是传值操作 ...

随机推荐

  1. window 中安装 hadoop

    win10上部署Hadoop-2.7.3——非Cygwin.非虚拟机   开始接触Hadoop,听人说一般都是在Lunix下部署Hadoop,但是本人Lunix不是很了解,所以Google以下如何在W ...

  2. Pseudoprime numbers---费马小定理

    Pseudoprime numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13406   Accepted: 5 ...

  3. 宽度优先搜索(BFS)— 20180909 - 20180917

    BFS几类题: 1.图的遍历:a.层级遍历 b.由点及面 c.拓扑排序 2.简单图最短路径: 简单图:1.无向图 2.边权重一致 图的时间复杂度: N个点,M条边,M最大是N^2,时间复杂度O(N+M ...

  4. SpringCloud---服务治理---Spring Cloud Eureka

    1.概述 1.1 Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理 ...

  5. jquery、js判断复选框是否选中

    js: if (document.getElementById("checkboxID").checked) { alert("checkobx is checked&q ...

  6. LeetCode 112.路径总和(C++)

    给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = 22 ...

  7. 怎么理解impala(impala工作原理是什么)

    下面给大家介绍怎么理解impala,impala工作原理是什么. Impala是hadoop上交互式MPP SQL引擎, 也是目前性能最好的开源SQL-on-hadoop方案. 如下图所示, impa ...

  8. JS实现多少小时前,多少天前...

    最近需要实现题目的功能,因为我的时间戳是PHP生成的,所以转换JS时间戳需要乘1000,废话不多说,看下面的代码把! 大家可以判断一下传进来的值是否为数值型,还有判断是否比当前的时间戳大!可以根据结果 ...

  9. Linux getopt()函数 getopt_long()函数---转

    http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...

  10. 微信小程序转百度小程序修改

    百度小程序对比微信小程序(最初版):[设备]项里没有内存监控.iBeacon.wifi.蓝牙.用户截屏.手机联系人.NFC[位置]项里没有打开地图选择位置[界面]项里没有绘图功能.没有节点信息获取功能 ...