您需要在没有返回值的情况下实现这样的方法。如果没有返回值,那么我们可以只使用传递的参数“拉出”信息,据我了解。试图实现这个(get方法),没有用。我真的不明白为什么它没有成功,因为 String 是一个引用类型,并且传递了引用的副本。
public class Ex3 {
private ArrayList<Integer> array;
private String str;
public Ex3(ArrayList array, String str){
this.array = array;
this.str=str;
}
public void get(String ourString){ //Попытка реализации такого метода
ourString=str;
return;
}
}
问题原因:
要了解这种行为的原因,您需要了解 Java 中使用内存的原则:
heap) 上创建,即 在应用程序的共享内存中;stack)中,即 在特定应用程序线程的内存中;因此,
=方法参数的值的任何更改(通过使用赋值运算符)绝不会影响方法调用站点中变量的值。或许这个例子可以帮助你更清楚地理解上述使用内存的机制。
解决问题的方法:
创建一个对象,它是您要在方法中填写的字段的包装器,在方法调用参数中提供对该对象实例的引用:
同样,您应该明白,在这种情况下,您并没有给出
null包装对象的实例 overString,因为 否则,您根本就没有堆中的任何对象来填充该字段。您可以对集合项(例如
ArrayList)执行相同操作,因为 它们本身是对象数组 (Object[]) 的包装器,即 从某种意义上说,他们也是Wrapper。还值得理解的是,事实上,类
String本身是一个字节数组(它有一个字段private final byte[] value;)的包装器,它提供了处理它的方法,就像处理某种编码中的字符(例如,UTF-8)一样。但是,由于类实例的不变性 () ,您无法更改现有实例中字节字段的内容
String(就像上面的类示例一样) 。WrapperimmutableString类实例中的不变性是
String由于以下事实而实现的:final);private,缺少set'a,并且在调用方法时也仅返回字节数组的副本getBytes)。填写方法中已有的字段,例如静态类字段:
你不应该在 Java 中滥用静态,我给出这样一个例子只是为了说明一个可能的选择。
建议:
尽管如此,如果您想“填充”传递对象的字段,那么以不同的
get方式调用该方法显然更好,例如fill,因为 否则,它的名字会误导人们阅读你的代码。