class prog {
static String display(String s)
{
s = "this is a test";
return s;
}
public static void main(String...args) {
prog p = new prog();
String s1 = "another";
System.out.println(display(s1)); //Line 1
System.out.println(s1);
}
}
一个新手问题。
有人可以解释为什么s1没有更新为“这是一个测试”吗?
我认为在Java中,对象参数作为引用传递,如果是这种情况,那么我将传递String s1
对象作为第1行的引用。
s1
应该通过display()
方法设置为“这是一个测试”..对吗?
答案 0 :(得分:15)
Java总是以值传递。对于引用类型,它传递引用值的副本。
在你的
中static String display(String s)
{
s = "this is a test";
return s;
}
重新分配String s
引用,其值已更改。被调用的代码不会看到此更改,因为该值是副本。
使用String
s,很难显示行为,因为它们是不可变的但是例如
public class Foo {
int foo;
}
public static void main(String[] args) {
Foo f = new Foo();
f.foo = 3;
doFoo(f);
System.out.println(f.foo); // prints 19
}
public static void doFoo(Foo some) {
some.foo = 19;
}
但是,如果你有
public static void doFoo(Foo some) {
some = new Foo();
some.foo = 19;
}
原作仍会显示3
,因为您没有通过您传递的引用访问该对象,而是通过new
引用访问该对象。
当然,您始终可以返回新引用并将其分配给某个变量,甚至可能与传递给方法的变量相同。
答案 1 :(得分:3)
String
是一个按值传递的引用。您可以更改参考点的位置,但不能更改来电者的副本。如果对象是可变的,你可以改变它的内容。
简而言之,Java总是通过VALUE传递,它从未做过任何其他事情。
答案 2 :(得分:2)
正如其他人所提到的,String s1是一个通过值传递的引用,因此方法中的s1引用仍指向旧字符串。
我相信您要这样做以将返回的值分配回字符串s1:
String s1 = "another";
s1 = display(s1);
System.out.println(display(s1))
答案 3 :(得分:0)
实际上在程序中你有两个引用字符串变量s1和s 当你调用display(s1)时。 s1和s都将引用String“another”。
但是在显示方法中你要改变s的引用指向另一个字符串“这是一个测试”而s1仍将指向“另一个”
现在s和s1正在对两种不同的叮咬进行辩护
显示(s1) - >保留s的参考,将打印“这是一个测试”
仅当您指定s = display(s1)时,两个变量都将引用相同的字符串
答案 4 :(得分:0)
因为String是不可变的,所以如果你不将函数的返回值分配给你的问题中的string.so,那么就不会发生变化。将display(s1)的值赋值给s。
s =显示(s1);然后字符串s的值将会改变。
当我编写程序来获取一些排列字符串时,我也得到了未改变的值(尽管它没有给出所有的排列,但这是例如回答你的问题)
这是一个例子。
import java.io.*;
public class MyString {
public static void main(String []args)throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s=br.readLine().trim();
int n=0;int k=0;
while(n!=s.length()){
while(k<n){
swap(s,k,n);
System.out.println(s);
swap(s,k,n);
k++;
}
n++;
}
}
public static void swap(String s,int n1,int n2){
char temp;
temp=s.charAt(n1);
StringBuilder sb=new StringBuilder(s);
sb.setCharAt(n1,s.charAt(n2));
sb.setCharAt(n2,temp);
s=sb.toString();
}
}
但我没有从上面的代码中获取字符串的置换值。所以我将交换函数的返回值分配给字符串并获得更改后的值串。 在分配返回值后,我得到了字符串的置换值。
//import java.util.*;
import java.io.*;
public class MyString {
public static void main(String []args)throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s=br.readLine().trim();
int n=0;int k=0;
while(n!=s.length()){
while(k<n){
s=swap(s,k,n);
System.out.println(s);
s=swap(s,k,n);
k++;
}
n++;
}
}
public static String swap(String s,int n1,int n2){
char temp;
temp=s.charAt(n1);
StringBuilder sb=new StringBuilder(s);
sb.setCharAt(n1,s.charAt(n2));
sb.setCharAt(n2,temp);
s=sb.toString();
return s;
}
}