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的原则, 如果数组作为参数传入方法,理论上来说是引用传递,为何会未被初始化。 展开
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的原则, 如果数组作为参数传入方法,理论上来说是引用传递,为何会未被初始化。 展开
展开全部
我明白你的意思。你是说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即可。一般大型的应用才会专门把返回结果封装为类。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询