2013-09-06 2 views
2
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); 
    } 
} 

новичок вопрос.Передача Строковые объекты в качестве аргументов Java

Может кто-нибудь объяснить, почему s1 не обновляется до «это тест»?.

Я думал, что в Java, аргументы объектов передаются как ссылки, и если это так, то я передаю Струнный s1 объект в качестве ссылки в строке 1.

И s1 должны были установлены на «это тест "через метод display(). Правильно?

+0

Поскольку параметры являются «по значению» в Java. –

ответ

12

Java всегда передается по значению. Для ссылочных типов он передает копию значения ссылки.

В вашем

static String display(String s) 
{ 
    s = "this is a test"; 
    return s;  
} 

The String s ссылки переназначен, его значение изменяется. Вызываемый код не увидит это изменение, потому что это значение было копией.

С String с, это трудно показать поведение, потому что они являются неизменными, но возьмем, к примеру

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.


Конечно, вы всегда можете вернуть новую ссылку и назначить его на какой-либо переменной, может быть, даже тот же, который вы передаёте методу.

3

String - это ссылка, которая передается по значению. Вы можете изменить, где контрольные точки, но не копия вызывающего абонента. Если объект изменен, вы можете изменить его содержимое.

Короче говоря, Java ALWAYS прошло мимо VALUE, он никогда ничего не делал.

2

Как упоминалось выше, String s1 является ссылкой, которая передается по значению, и поэтому ссылка s1 в вашем методе по-прежнему указывает на старую строку.

Я считаю, что вы хотите сделать это, чтобы присвоить возвращаемое значение обратно в строке s1:

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

System.out.println(display(s1)) 
0

На самом деле в программе вы имеете две ссылки строковая переменная s1 и s когда вы вызываете дисплей (s1). Оба s1 и s будут ссылаться на String «another».

но внутри метода отображения изменяемой референции с, чтобы указать другую строку «это тест» и s1 будет по-прежнему указует на «другой»

Теперь S и s1 держит refence двух различных укусов

дисплей (s1) -> которые держат обращение с, напечатает "это тест"

только если вы назначаете s = дисплей (s1) и переменная будет ссылаться на ту же строку

0

Потому что Стрин g неизменен, поэтому изменения не будут возникать, если вы не будете назначать возвращаемое значение функции string.so в вопросе присваивания значения отображения (s1) на s.

s = display (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(); 
} 
} 

, но я не получал переставленное значение строки из выше code.So я назначил возвращаемого значение функции подкачки к струне и получил измененные значения строки. после присвоения возвращаемого значения i получил перестановочные значения строки.

//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; 
} 
} 
Смежные вопросы