String作为输出型参数时获取不到值
有时候在一个方法中,我们需要返回多个字符串,而又不想将这些字段包成一个类。此时就需要使用输出型参数。
但是如果将输出型参数的类型声明为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作为输出型参数时获取不到值的更多相关文章
- 关于strcpy函数形参类型的解析和指针作为输入型输出型参数的不同
在C语言中,字符串一直都是热点,关于strcpy函数大家都很熟悉,但是真正了解的很少,一旦用到总会报一大堆莫名其妙错误,今天我就来给大家详细剖析一下strcpy函数. 虽然不能看到strcpy的内部实 ...
- 关于ASP.NET中WEBAPI中POST请求中FromBody修饰的string类型的参数服务器端获取不到值FromBody空值的简单解决方法
其实解决办法很简单,就是POST请求的时候,来自实体的参数,content-type:application/x-www-form-urlencoded情况下,是默认按照键值对来解析的,比如param ...
- @RequestBody 参数为string正常改为对象时不报错但获取不到值
@RequestBody 参数为string正常改为对象时不报错但获取不到值 试了好多办法都不行 最后 原因 jackson 包的版本号不匹配 2.9.0的不能封装进对象,可以运行且不报错但获取不到 ...
- servlet获取参数时,request.getParameter("id")参数获取失败
servlet获取参数时,request.getParameter("id")参数获取失败,这里的参数是“index”里面href中的参数 要注意,取不到值,是不是要取的参数有没有 ...
- 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案
1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...
- Servlet --启动时创建、配置url、ServlectContext、初始化参数、获取资源
servlet的版本的区别 2.5版本, Servlet的配置只支持在xml文件中的配置 3.0版本: Servlet的配置支持在xml文件中的配置, 也可以使用注解的方式, 默认使用注解 让服务器在 ...
- ref引用类型,数组型参数,out输出参数
ref和out的相同点和不同点 共同点:都是引用传递不同点:ref的参数在调用之前一定要赋值,在方法调用的过程中可以不要赋值. out的参数在调用之前可以不赋值,在方法调用的过程中一定要赋值. ...
- @PathVariable出现点号"."时导致路径参数截断获取不全的解决办法
@PathVariable出现点号"."时导致路径参数截断获取不全的解决办法 比如,我路径是/test/{name},name的值是1.2.3.4,后台用@PathVariable ...
- JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题
项目的权限分配,采用的是RBAC的设计模式.后台配置权限的时候,需要获取到所有的权限因子. 不经让我想起YII框架的SRBAC模块,还有以前的一个ecshop改造系统的权限配置方式,都采用的是PHP的 ...
随机推荐
- Matlab结构体定义
定义一个Matlab结构体的代码,以飞行器为例: classdef flightpro properties pos = [ ]; RGB = [ ]; rate; type; end end
- python 智能合约日志操作
from __future__ import unicode_literals import json from time import sleep, time # 中文编码 def encode_s ...
- Spring Boot - Filter实现简单的Http Basic认证
Copy自http://blog.csdn.net/sun_t89/article/details/51916834 @SpringBootApplicationpublic class Spring ...
- 使用Promise链式调用解决多个异步回调的问题
使用Promise链式调用解决多个异步回调的问题 比如我们平常经常遇到的一种情况: 网站中需要先获取用户名,然后再根据用户名去获取用户信息.这里获取用户名getUserName()和获取用户信息get ...
- 关于LNMP常见问题和性能方面的个人理解
简单整理,自己做备忘的,不为其他作任何参考- PHP程序 1.开启慢日志,过滤超时时间为1s的方法,针对性优化,可以通过添加缓存方式解决. 2.过滤access日志,统计哪些请求较多较为频繁,是否合理 ...
- 11.24Daily Scrum(3)
人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.1002 数据库测试 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.1003 实现视频浏览的功能 ...
- UVA 167 R-The Sultan's Successors
https://vjudge.net/contest/68264#problem/R The Sultan of Nubia has no children, so she has decided t ...
- array to object
array to object native js & ES6 https://stackoverflow.com/questions/4215737/convert-array-to-obj ...
- 【Python】从1<2<3的语法糖说起
python有一个很有意思的语法糖你可以直接写1<2<3. 这复合我们通常意义上的数学不等式,但对学过C等语言其实是有疑惑的. 我们知道不等式返回的其实是个Bool值,在C中是1,0因此C ...
- vdbench和fio测试磁盘性能的对比总结
一.安装 1.安装vdbench,首先安装java:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...