将字符串对象作为参数传递给Java

将字符串对象作为参数传递给Java,java,Java,一个新手问题 有人能解释为什么s1没有更新为“这是一个测试”吗 我认为在Java中,对象参数是作为引用传递的,如果是这样,那么我将在第1行中作为引用传递字符串s1object 应通过display()方法将s1设置为“这是一个测试”。。对吗?Java总是按值传递。对于引用类型,它传递引用值的副本 在你的 class prog { static String display(String s) { s = "this is a test";

一个新手问题

有人能解释为什么s1没有更新为“这是一个测试”吗

我认为在Java中,对象参数是作为引用传递的,如果是这样,那么我将在第1行中作为引用传递字符串
s1
object


应通过
display()
方法将
s1
设置为“这是一个测试”。。对吗?

Java总是按值传递。对于引用类型,它传递引用值的副本

在你的

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);
   }
}
字符串s
引用被重新分配,其值被更改。被调用的代码不会看到此更改,因为该值是副本

使用
String
s,很难显示行为,因为它们是不可变的,但举个例子

static String display(String s)
{
    s = "this is a test";
    return 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;
}
原始文件仍将显示
3
,因为您不是通过传递的引用访问对象,而是通过
new
引用访问对象



当然,您始终可以返回新引用并将其分配给某个变量,甚至可能是传递给方法的同一个变量。

String
是一个按值传递的引用。您可以更改引用点的位置,但不能更改调用方的副本。如果对象是可变的,则可以更改其内容


简而言之,Java总是按值传递,它从来没有做过任何其他事情。

正如其他人提到的,字符串s1是按值传递的引用,因此方法中的s1引用仍然指向旧字符串

我相信您希望这样做以将返回值赋回字符串s1:

public static void doFoo(Foo some) {
    some = new Foo();
    some.foo = 19;
}

实际上,在程序中有两个参考字符串变量s1和s 当您调用display(s1)时。s1和s都将引用字符串“另一个”

但是在display方法中,您将s的引用更改为指向另一个字符串“thisatest”,s1仍将指向“other”

现在s和s1代表两个不同的stings

显示屏(s1)-->保存s的参考,将打印“这是一个测试”


仅当您指定s=display(s1)时,两个变量将引用相同的字符串,因为字符串是不可变的,所以如果您不将函数的返回值指定给字符串,则不会发生更改。因此,在您的问题中,将display(s1)的值指定给s。

s=显示(s1);然后字符串s的值将改变。

当我编写程序以获取一些排列字符串时,我也得到了未更改的值(虽然它没有给出所有排列,但这只是为了回答您的问题)

这里有一个例子

String s1 = "another";
s1 = display(s1);

System.out.println(display(s1))
import java.io.*;
公共类MyString{
公共静态void main(字符串[]args)引发IOException{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
字符串s=br.readLine().trim();
int n=0;int k=0;
而(n!=s.length()){
while(kbe)因为参数在Java中是“按值”的。
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;
}
}