有时候在一个方法中,我们需要返回多个字符串,而又不想将这些字段包成一个类。此时就需要使用输出型参数。

但是如果将输出型参数的类型声明为String,那么调用该方法后,是获取不到我们想要的值的。

测试代码如下:

public class StringTest {

	public static void main(String[] args){
StringTest st = new StringTest();
String a = "a";
String b = "b";
st.testReferenceParam(a, b);
System.out.println("a="+a + "; b=" + b );
} public void testReferenceParam(String A, String B){
A = "This is A";
B = "This is B";
return;
}
}

  输入为:

a=a; b=b

  这是什么原因呢?

这需要从内存原理,以及引用传参方面来解释。

内存原理:一个String指向的对象(此处排除常量字符串)是在堆上存在的,String变量则在栈上存在。当将其作为参数传递给方法时,方法会再声明一个字符串变量,这个变量指向的对象和传进来的参数指向的是同一个对象。如果在方法执行中,该对象里的内容发生了变化,则方法执行过后,该变化保留了下来,此时可以看到原实参指向的对象内容缺失变了。但如果在方法执行过程中,只是将形参指向的对象换了,那么新对象的内容不会更新到实参指向的对象的。上述例子就是后者这种情况。

怎么才能获取到想要的值呢?

不要改变形参指向的对象,而只改变对象的内容。由于String是内容不可变字符串,所以要改用StringBuilder或StringBuffer。

改后代码:

public class StringTest {

	public static void main(String[] args){
StringTest st = new StringTest();
StringBuilder a = new StringBuilder("a");
StringBuilder b = new StringBuilder("b");
st.testReferenceParam(a, b);
System.out.println("a="+a + "; b=" + b );
} public void testReferenceParam(StringBuilder A, StringBuilder B){
A.append(" This is A");
B.append(" This is B");
return;
}
}

  输出:

a=a This is A; b=b This is B

  

  以上纯属个人理解,如有错误,敬请指正。

String作为输出型参数时获取不到值的更多相关文章

  1. 关于strcpy函数形参类型的解析和指针作为输入型输出型参数的不同

    在C语言中,字符串一直都是热点,关于strcpy函数大家都很熟悉,但是真正了解的很少,一旦用到总会报一大堆莫名其妙错误,今天我就来给大家详细剖析一下strcpy函数. 虽然不能看到strcpy的内部实 ...

  2. 关于ASP.NET中WEBAPI中POST请求中FromBody修饰的string类型的参数服务器端获取不到值FromBody空值的简单解决方法

    其实解决办法很简单,就是POST请求的时候,来自实体的参数,content-type:application/x-www-form-urlencoded情况下,是默认按照键值对来解析的,比如param ...

  3. @RequestBody 参数为string正常改为对象时不报错但获取不到值

    @RequestBody 参数为string正常改为对象时不报错但获取不到值 试了好多办法都不行 最后 原因  jackson 包的版本号不匹配 2.9.0的不能封装进对象,可以运行且不报错但获取不到 ...

  4. servlet获取参数时,request.getParameter("id")参数获取失败

    servlet获取参数时,request.getParameter("id")参数获取失败,这里的参数是“index”里面href中的参数 要注意,取不到值,是不是要取的参数有没有 ...

  5. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

  6. Servlet --启动时创建、配置url、ServlectContext、初始化参数、获取资源

    servlet的版本的区别 2.5版本, Servlet的配置只支持在xml文件中的配置 3.0版本: Servlet的配置支持在xml文件中的配置, 也可以使用注解的方式, 默认使用注解 让服务器在 ...

  7. ref引用类型,数组型参数,out输出参数

    ref和out的相同点和不同点 共同点:都是引用传递不同点:ref的参数在调用之前一定要赋值,在方法调用的过程中可以不要赋值.    out的参数在调用之前可以不赋值,在方法调用的过程中一定要赋值. ...

  8. @PathVariable出现点号"."时导致路径参数截断获取不全的解决办法

    @PathVariable出现点号"."时导致路径参数截断获取不全的解决办法 比如,我路径是/test/{name},name的值是1.2.3.4,后台用@PathVariable ...

  9. JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题

    项目的权限分配,采用的是RBAC的设计模式.后台配置权限的时候,需要获取到所有的权限因子. 不经让我想起YII框架的SRBAC模块,还有以前的一个ecshop改造系统的权限配置方式,都采用的是PHP的 ...

随机推荐

  1. 创新手机游戏《3L》开发点滴(3)——道具、物品、装备表设计 V2(最终版)

    我们正在开发一款新手游,里面有道具,之前也写了一篇博文记录了下我们的设计思路,但是国庆到了,于是我有了时间继续纠结这个问题. 其实我主要是在到底是用mysql还是mongodb上纠结.这个复杂.痛苦. ...

  2. 【转】C++后台开发之我见

    工作也快两年了,偶然看到自己以前写过的一些技术博客,发现自己自毕业后一直没有更新过自己的技术博客,趁现在是刚过完春节快要回公司工作之际,谈谈我个人对后台开发的一些个人见解,希望能够对在校的学生或者刚刚 ...

  3. Switches and Lamps(思维)

    You are given n switches and m lamps. The i-th switch turns on some subset of the lamps. This inform ...

  4. 【IdentityServer4文档】- 欢迎来到 IdentityServer4

    欢迎来到 IdentityServer4 IdentityServer4 是一款包含和实现了 OpenID Connect 和 OAuth 2.0 协议的,适用于 ASP.NET Core 的框架 . ...

  5. UVALive - 6868 Facility Locations 想法题

    题目链接: http://acm.hust.edu.cn/vjudge/problem/88634 Facility Locations Time Limit: 3000MS 题意 给你一个m*n的矩 ...

  6. <Android>对话框的使用

    Android系统提供四种对话框:警告对话框(AlertDialog),进度对话框(ProgressDialog),日期选择对话框(DatePickerDialog)和时间选择对话框(TimePick ...

  7. Zigbee安全基础篇Part.1

    原文地址: https://www.4hou.com/wireless/14211.html 导语:ZigBee是一种开源无线技术,用于低功耗嵌入式设备(无线电系统).本文探讨了ZigBee协议的可用 ...

  8. ZOJ 1229 M-Gift?!

    https://vjudge.net/contest/67836#problem/M There is a beautiful river in a small village. N rocks ar ...

  9. 最近面试js部分试题总结

    二,JavaScript面试题总结 1,首先是数组去重算法:给一个数组,去掉重复值 (function() { var arr = [1, 2, 3, 3, 4, ]; function unique ...

  10. 【bzoj5107】[CodePlus2017]找爸爸 dp

    题目描述 给出两个基因串,你需要在其中插入任意个空格,使得两个串长度相同.如果两个串的某同一位置都是字母则获得某给定收益,对于每个串的每个长度为k的连续空格段要付出a(k-1)+b的损失.求最大净收益 ...