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. webgoat环境搭建

    链接: https://pan.baidu.com/s/1gfEKIyB 密码: 5zdq 1:配置Java环境变量,过程请找度娘 2:解压下载好的tomcat 3:将webgoat-containe ...

  2. Android高级工程师面试题整理

    这些题目是网友去百度.小米.乐视.美团.58.猎豹.360.新浪.搜狐等一线互联网公司面试被问到的题目.熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率. 主要分为以下几部分: (1)java ...

  3. 获取各站点的ID

    using (var serverManager = new ServerManager()) { foreach(var site in serverManager.Sites) { Console ...

  4. js插件编程-tab框

    JS代码 (function (w) { //tab对象 function Tab(config) { //定义变量,防止变量污染 this.tabMenus=null; this.tabMains= ...

  5. zabbix 千台服务器自动添加实战

    一,模式   zabbix 的自动添加 主机有梁祝方式: 自动发现-----被动模式 由服务端主动发起,Zabbix Server开启发现进程,定时扫描局域网中IP服务器.设备, 自动注册----主动 ...

  6. ionic resources

    下面是我在使用ionic,cordova,angularjs的时候经常使用的资源. ionic css components cordova documentation ionic icons ngC ...

  7. springsource-tool-suite下载(sts)

    1 新版本的插件下载 1 直接进入官网下载即可 官网地址:http://spring.io/tools/sts/all. 2 spring官网上下载历史版本的spring插件 1 获取新版本的插件的地 ...

  8. TerraBuilder创建地形之去除影像黑边,填充影像

    最近在Skyline项目中使用TerraBuilder创建地形,由于地形比较大,分块下载卫星影像,然后再TerraBuilder中合并,由于合并.图形等等问题,导致创建处理出来的地形中存在严重的缝隙和 ...

  9. Java线程中断的本质深入理解

    Java的中断是一种协作机制.也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己. 一.Java中断的现象 首先,看看Thread类里的 ...

  10. c#-cs-bs-正则表达式

    C/S     B/S Cs结构:     C/S(Client/Server)客户机/服务器 BS机构:     B/S(Browser/Server)浏览器/服务器       à(未来发展方向) ...