Java传递引用类型的实质

   首先看java代码如下:

  import java.util.Scanner;

  import org.junit.Test;

  public class TestCoreJava {

  @Test

  public void testString() {

  String original = "原来的值";

  modifyA(original);

  System.out.println(original);

  StringBuffer sb = new StringBuffer();

  sb.append(original);

  modifyObject(sb);

  System.out.println(sb.toString());

  }

  public void modifyA(String b) {

  b = "改变的值";

  }

  public void modifyObject(StringBuffer object ) {

  String b = "改变的值";

  StringBuffer sb1 = new StringBuffer();

  sb1.append(b);

  //object.append(b); 在object指向的引用没改变之前,调用append方法对其指向的堆内存中内容进行修改,是可以达到修改原始StringBuffer对象sb的存放内容这个目的的。

  object = sb1;

  }

  }

  说明:除开八种基本类型之外,在java中其余类型都是引用类型,包括String也是引用类型,传递的也是引用。

  我原以为,既然传递的是引用,那么String对象original交由方法modifyA处理后,original存放的值应该变为“改变的值”

  同样StringBuffer对象sb存放的值也应该改变成“改变的值”,但是结果却没有,输出都为“原来的值”,然后我就怀疑是否他们传递的不是引用

  原来:modifyA(String b)方法在被调用时,original传递给该方法,该法是创建了一个新的String对象b,它也将引用指向original对象指向的那块

  堆内存。而我在modifyA方法中使用语句:b = "改变的值";该语句并不能够到达改变original对象的目的,他紧紧将b对象的引用地址改为指向“改变的值”

  这个对象所在的堆内存。所以original对象还是指向原来的堆内存,当然他的输出结果不变,同样的问题对StringBuffer对象sb也存在。

  所以可以看出,没有到达期望结果的原因是使用“=”赋值运算符,他修改了副本对象(被调用方法自己创建的中间对象,比如modifyA方法创建的b)的引用地址,

  使他指向了不同的堆内存(这对原始的对象内容是没有影响的),而没有实际修改他指向的堆内存中具体值导致的意外。

  所以 modifyObject方法中那条被注释语句可以达到修改原始内容的目的.

时间: 2024-04-22 03:25:32

Java传递引用类型的实质的相关文章

对象-java传递 ”值传递和引用传递“还是全部 “值传递”

问题描述 java传递 "值传递和引用传递"还是全部 "值传递" 若说值传递.基本类型是copy的值赋给形参,对象是把 堆中对象的 地址 传给 形参. 若说分为值传递和引用传递..引用传递 是因为这个传的地址,导致实参和形参 操作的都是同一块内存. 有点乱,像文字层次上的撕逼.. 若往引用传递方面思考,C++的指针又把我搅乱了.,java里不能直接管理内存,传递的不是 变量本身 的栈地址.而是变量的内容(值) 解决方案 java没有什么值传递引用传递,都是传递对象引

JAVA 【引用类型】和【对象类型】在【继承】中的异同

介绍     JAVA [引用类型]和[对象类型]在[继承]中的异同,这个问题自己整理过N次,也被人当菜鸟问过N次.所以,在此简单整理一下,以供大家分享. 在继承关系中,一般成员变量是根据引用类型 在继承关系中,静态成员变量是根据引用类型 在继承关系中,一般方法是根据对象类型 在继承关系中,静态方法是根据引用类型 注意     静态成员变量,静态方法是基于类的,本文为了测试观察,所以,会用对象去引用静态成员变量和静态方法.      Super Class: package shuai.stud

Java/Android引用类型及其使用全面分析_java

Java/Android中有四种引用类型,分别是: Strong reference - 强引用 Soft Reference - 软引用 Weak Reference - 弱引用 Phantom Reference - 虚引用 不同的引用类型有着不同的特性,同时也对应着不同的使用场景. 1.Strong reference - 强引用 实际编码中最常见的一种引用类型.常见形式如:A a = new A();等.强引用本身存储在栈内存中,其存储指向对内存中对象的地址.一般情况下,当对内存中的对象

跳转-java传递json,接收时异常CharConversionException。

问题描述 java传递json,接收时异常CharConversionException. String url="/UEAnalyze/BaoZhang.do?bzApply&jsonarray="+jsonarr1+"&jsonarray2="+jsonarr2; 其中jsonarray2有问题(其值类似:{"1":"主营业务成本-网络运行成本-外购动力费-IDC机房"}) 跳转方式:response.se

java传递json数据和文件如何在一个请求中完成

问题描述 java传递json数据和文件如何在一个请求中完成 因为是接口的原因,需要json数据来表示一些键值关系,然后接口还需要上传一个音频文件.怎么能在同一次HTTP请求中完成这两种数据传输呢.或者说怎么让两者共存呢,如果把文件转成字符串然后加如json数据中,json数据会变的很大.比原本文件的长度要长的多几乎是两倍 解决方案 可以使用FormData进行传递,具体方法自己查一下. 解决方案二: 我也想过用formData那样非常方便,但是架构师已经把接口数据定义好了.我的意见不可能被接受

指针-Java传递参数无法赋值

问题描述 Java传递参数无法赋值 为什么这样无法给pointer赋值,我debug看变量g.adjList[i}.firstedge明明不为null,但是整个循环下来pointer一直都是null,没有赋值成功请问这个什么回事? Graph是我定义的图的数据结构.firstedge的类型也是EdgeNode public static void showAll(Graph g) { for (int i = 1;i<= g.numVertexs ; i++) { 'EdgeNode point

java 传递过程中出现的问题解决方法

java 传递过程中出现的问题解决方法  * 测试conn关闭情况  */ package com.hb.test; import java.sql.connection; /**  *  * @author icecold  */ public class testconn {    static connection conn = null;     public static void main(string[] args)throws exception {         conn =

java的引用类型的详细介绍_java

•强引用(FinalReference),在java中,有点像C++的指针,通过引用,可以对堆中的对象进行操作.强引用具备以下特点: 1.强引用可以直接访问目标对象:2.强引用所指向的对象在任务时候都不会被系统回收:3.强引用可能导致内存泄露.•软引用(SoftReference),软引用对象,在响应内存需要时,由垃圾回收器决定是否清除此对象.一个持有软件引用的对象,不会被JVM很快回收,只要有足够的内存,软件引用便可能在内存中存活相当长的时间,软引用对象最常用于实现内存敏感的缓存:•弱引用(W

Java传递程序员变量

        解决方案虽然简单,不过若是想不起来就麻烦啦,好方法往往简单.         1.如何在一个java文件叫A里用另一个java文件叫B的方法叫method()?                  答:直接new B().method().         2.如何在一个java文件叫A里用另一个java文件叫B的成员变量叫val?                  答:我想起了单例模式,可以在A里写一个方法叫returnVal返回val,然后按之第一种方式即可.