java 字符串数组作为参数传递结果未初始化

源代码如下publicclassReverseString{String[]result;Stringinput="Iamastudent,andIam20-year-o... 源代码如下
public class ReverseString
{
String[] result;

String input = "I am a student, and I am 20-year-old.";

public static void main(String[] args)
{
// TODO Auto-generated method stub
ReverseString reverseString = new ReverseString();

}

public ReverseString()
{
int returnCode = Converse(input, result);
System.out.println("\n" + returnCode);
}

private int Converse(String pInput, String[] pOutput)
{
String regExp = "[^0-9a-zA-Z]";
String wordArray = pInput.replaceAll("-", "zXcVbNm");
wordArray = wordArray.replaceAll(regExp, " ");
wordArray = wordArray.replaceAll("zXcVbNm", "-");
pOutput = wordArray.split(" ");

if (pOutput.length == 0)
{
return -1;
}

for (int i = pOutput.length - 1; i >= 0; i--)
{
System.out.print(pOutput[i] + " ");
}
return 0;
}

}

这段代码跑的是没问题的。
问题:
构造函数中的pOutput本来是作为输出参数的,在调用Converse方法后直接println("result")结果是null,证明result未被初始化,但是debug发现,Converse方法内的pOutput已经有值了。
按照java的原则, 如果数组作为参数传入方法,理论上来说是引用传递,为何会未被初始化。
展开
 我来答
abcd6559402
2018-01-24 · TA获得超过2054个赞
知道小有建树答主
回答量:1883
采纳率:62%
帮助的人:204万
展开全部
我明白你的意思。你是说result这个数组作为参数传递进去,在执行Converse方法后为啥还是null对吗。其实是这样。引用传递没错。但是你忘记了一件事。String [] result没有初始化,那么其实String [] result = null;所有成员变量会默认初始化,只不过引用型默认为null。这样一来,result=null。相当于你在Converse(input,result)时传了null进去。这时,pOutput=result ,即pOutput=null,执行这一句pOutput = wordArray.split(" ")后pOutput指向了一个String[]对象不为null了,但是方法结束后pOutput就弹栈了就死了而result还指向null;因此当该方法结束后result还是null。
追问
分析的很有道理,多谢哈。接下来问题又来了,由于每个方法只能有一个返回参数,在本例中即returnCode,那么如果我想在这个方法被条用后返回多个参数呢,即除了returnCode之后,还想得到pOutput的结果,应该怎么处理?
追答
这个我能想到的有两种方式。第一种面向对象,你创建一个类,把你要的参数定义在这个类中,如我创建一个类Result其中有 returnCode,pOutput两个成员变量,并使用这两个成员生成有参数构造方法和getter/setter方法。然后在你上面的代码中创建一个Result对象,把returnCode和pOutput放入这个对象。放入这个对象你可以通过有参数构造器或者set方法。第二种,使用java提供的集合类,例如你可以把returnCode和pOutput放入一个HashMap。其中String用来写参数名称,Object存放值。在你这个例子中用HashMap即可。一般大型的应用才会专门把返回结果封装为类。
百度网友f2b7757
2018-01-24 · 超过36用户采纳过TA的回答
知道小有建树答主
回答量:90
采纳率:0%
帮助的人:37.1万
展开全部

成员变量可以在本类任意函数使用,static 修饰的代码块使用成员变量也需用static修饰.即使成员变量未初始化也可以使用

本类中你声明了String[]result;但在使用前并未初始化

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式