以你的程序为例: jvm实际上是ldc <String "小夜班">,然后astore_1 [string] 可是main中的字符串变量str,索引依然是null [解决办法] 这个一定要考虑值传递还是地址传递的问题。首先:java里面没有指针,java里面做地址传递的方式就是使用非基础数据类型,例如对象,数组等等。字符串作为一种基础数据类型,不可以用来进行地址传递。楼主的例子是值传递的。把String类型改成Int类型,结果还是默认值。要解决这种情况我想到了两种方式。第一种就是把传入的保存结果的类型改成对象或者数组;第二种方式,去掉保存结果的参数,将结果作为返回值返回。 [解决办法] public class A{ private String[] _str = {"早班","晚班","小夜班","大夜班"};
//这里这个string 是string2 是属于toNew的局部变量 public void toNew(String string,int flag){ switch(flag){ //引用在这里发生改变,但是改变的是string的指向 和 main中的str无关 case 0:string = _str[0];break; case 1:string = _str[1];break; case 2:string = _str[2];break; case 3:string = _str[3];break; default: System.out.println("哥们儿,按规矩办事,请输入1、2、3、4中任意一个");break; } } public static void main(String[] arg0){ String str = null ; //这里的这个是属于main的局部变量 new A().toNew(str,3); System.out.println(str); } } [解决办法] 你要把方法里面的值传出来应该用return返回出来,或者直接定义一个全局变量,在方法里把要输出的值赋给全局变量才行,你把值传给方法中的局部变量是传不出值来的 [解决办法] 你如果把str变成全局变量就没有问题了,你上边那个方法并没有返回值,str的值返回不回去,自然就是空的。 [解决办法] 你上边错在没有传递值给str,str在上边的方法里的值并不会到你的main里边、 [解决办法] 啥叫形参和实参,是时候翻一下书了 [解决办法] 自己多加几个输出看着结果再想想原因 [解决办法] 楼上的讲解都很正确,再给楼主补充一解决方案:
public class A { private String[] _str = {"早班","晚班","小夜班","大夜班"}; public void toNew(Reference<String> string,int flag){ switch(flag){ case 0:string.set(_str[0]);break;
case 1:string.set(_str[1]);break; case 2:string.set(_str[2]);break; case 3:string.set(_str[3]);break; default: System.out.println("哥们儿,按规矩办事,请输入1、2、3、4中任意一个");break; } } public static void main(String[] arg0){ Reference<String> str = new Reference<String>() ; new A().toNew(str,3); System.out.println(str.get()); } }
class Reference<T> { private T value;
public T get() { return value; }
public void set(T value) { this.value = value; } }
public class A{ private String[] _str = {"早班","晚班","小夜班","大夜班"};
public void toNew(){ Scanner in = new Scanner(System.in); System.out.println("请按自己加班情况输入1、2、3、4中的一个"); int m = in.nextInt(); switch(m){
case 1:System.out.println(_str[0]);break; case 2:System.out.println(_str[1]);break; case 3:System.out.println(_str[2]);break; case 4:System.out.println(_str[3]);break; default: System.out.println("哥们儿,按规矩办事,请输入1、2、3、4中任意一个");break; } }
public static void main(String[] arg0){
new A().toNew();
} } [解决办法]
import java.util.Scanner;
public class A{ private String[] _str = {"早班","晚班","小夜班","大夜班"};
public void toNew(){ Scanner in = new Scanner(System.in); System.out.println("请按自己加班情况输入1、2、3、4中的一个"); int m = in.nextInt(); switch(m){
case 1:System.out.println(_str[0]);break; case 2:System.out.println(_str[1]);break; case 3:System.out.println(_str[2]);break; case 4:System.out.println(_str[3]);break; default: System.out.println("哥们儿,按规矩办事,请输入1、2、3、4中任意一个");break; } } public static void main(String[] arg0){
public class A { private String[] _str = {"早班","晚班","小夜班","大夜班"}; public String toNew(String string,int flag){ switch(flag){ case 0:string = _str[0];break; case 1:string = _str[1];break; case 2:string = _str[2];break;
case 3:string = _str[3];break; default: System.out.println("哥们儿,按规矩办事,请输入1、2、3、4中任意一个");break; } return string; } public static void main(String[] arg0){ String str = null ; str = new A().toNew(str,3); System.out.println(str); } }
[解决办法]
public String toNew(String string,int flag){ switch(flag){ case 0:string = _str[0];break; case 1:string = _str[1];break; case 2:string = _str[2];break; case 3:string = _str[3];break; default: System.out.println("哥们儿,按规矩办事,请输入1、2、3、4中任意一个");break; } return string; }
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];
/** The offset is the first index of the storage that is used. */ private final int offset;
/** The count is the number of characters in the String. */ private final int count;