首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

Str的值没传过去,why

2013-08-06 
Str的值没有传过去,why ?首先,请看代码:[解决办法]string是值传递,又不是引用传递,当然是null了。。。[解决办

Str的值没有传过去,why ?
首先,请看代码:

                                                                            
[解决办法]
string是值传递,又不是引用传递,当然是null了。。。
[解决办法]
不是说了是值传递么;

你想象一下你在toNew方法里改变flag的值,你觉得会影响main里你传的flag的值?
[解决办法]
toNew方法没有返回值并且赋于str,当然是null了,你这方法走不走一样
[解决办法]
String是一个不可变类,针对String对象,JVM使用了常量池,并且专门为string准备了CONSTANT_String_info结构,结构中存放的是到常量池中的索引。

所以一旦string对象变化,jvm会重新从常量池为字符串参数ldc一个新的string索引,而原string对象索引的常量保持不变。

以你的程序为例:
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里边、
[解决办法]
啥叫形参和实参,是时候翻一下书了
[解决办法]
自己多加几个输出看着结果再想想原因
Str的值没传过去,why
[解决办法]
楼上的讲解都很正确,再给楼主补充一解决方案:


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;
}
}


[解决办法]
对String来说 形参的内容相当于实参的一份拷贝 你在方法里面再怎么修改形参的值 实参是不会改变的
[解决办法]
同意楼上的,其实这样也可以的


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){
        
        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){
        
        new A().toNew();
       
    }
}
[解决办法]
你str的值从未赋值过,变的只是方法里的string变量,方法结束,string变量也没了
[解决办法]
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;
    }


你传入的string是传值调用,不是引用哦。。
[解决办法]
建议楼主先搞明白 什么事值传递 和引用传递 或者了解一下 java 在创建对象或者 声明一个变量的时候 是在内存中怎么分配空间的 就一目了然了。欢迎来到我的博客www.taomaipin.com
[解决办法]
引用:
Quote: 引用:

String是不可修改的,其作为参数传递是值传递,类似与C里面的指针。在函数内部试图对String对象的修改会导致创建新的字符串的产生,影响只能在函数内部,比如形参,函数外部的实参仍旧是指向原来的对象,因为String对象时不可修改的。


学到了 ... 

原来两者不一样 ! 

那么,String里面是怎么定义的,才使得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;

    //...
}


这三个都是final的,也就是常量,只能被赋值一次,是在创建该字符串对象的时候,以后对该字符串的任何操作都不能改变。以前我以为concat方法能够修改字符串,实际上 String strC = strA.concat(strB);中strC是指向一个新生成的字符串的引用、strA没变
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

String是不可修改的,其作为参数传递是值传递,类似与C里面的指针。在函数内部试图对String对象的修改会导致创建新的字符串的产生,影响只能在函数内部,比如形参,函数外部的实参仍旧是指向原来的对象,因为String对象时不可修改的。


学到了 ... 

原来两者不一样 ! 

那么,String里面是怎么定义的,才使得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;

    //...
}

这三个都是final的,也就是常量,只能被赋值一次,是在创建该字符串对象的时候,以后对该字符串的任何操作都不能改变。以前我以为concat方法能够修改字符串,实际上 String strC = strA.concat(strB);中strC是指向一个新生成的字符串的引用、strA没变


所谓好奇将至,! 
不过,容许我多问一句:我注意到你说strA.concat(strB)既然你说不能改,
那么: String A = "Hello ";String B = "World ! "
此时 StringBuffer sb = new StringBuffer(); A = sb.append(A).append(B).toString();后
这里的A是新的么 ?

因为我以前就是认为A被concat()了!
StringBuffer跟String不一样吧、、

热点排行
Bad Request.