初学者 一个问题请教 十分感谢

Java狂魔 2014-02-11 09:03:57
public class test {
static void change(String s){
s= "haha";
}
public static void main(String args[]){
String s = "wawa";
change(s);
System.out.println(s);
}
为什么最后输出不是haha啊 我不是都给他换了么
...全文
202 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzgww0902 2014-02-11
  • 打赏
  • 举报
回复
形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。 public class test { static void change(String 形参){ 形参 = "haha"; } public static void main(String args[]){ String 实参 = "wawa"; change(实参); 在执行到这里的时候,是形参将实参复制一份,形成了《实参的复制》,然后《实参的复制》赋值为haha,在这个函数调用完成以后,《实参的复制》这个东西就被杀掉了,而原来的《实参》根本没有发生变化。 System.out.println(s); }
日知己所无 2014-02-11
  • 打赏
  • 举报
回复
注意,即使像第26行这样书写代码也不会修改main方法中的s的值
class MyString {
    private String dataMemberString;

    public MyString(final String constructorString) {
        dataMemberString = constructorString;
    }

    @Override
    public String toString() {
        return dataMemberString;
    }

    public String getDataMemberString() {
        return dataMemberString;
    }

    public void setDataMemberString(String dataMemberString) {
        this.dataMemberString = dataMemberString;
    }
}

public class test1 {

    static void change(MyString s) {
//        s.setDataMemberString("haha");
        s = new MyString("haha");
    }

    public static void main(String[] args) {
        MyString s = new MyString("wawa");
        change(s);
        System.out.println(s);
    }

}
理由参考推荐1
日知己所无 2014-02-11
  • 打赏
  • 举报
回复
根据推荐文章1,JAVA语言: 从程序运行的角度来看,参数传递,只有传值,从不传递其它的东西。 只不过值的内容有可能是数据,也有可能是一个内存地址。 根据推荐文章2,可以使用“包装类”的办法实现“在方法内部改值”
class MyString {
    private String dataMemberString;

    public MyString(final String constructorString) {
        dataMemberString = constructorString;
    }

    @Override
    public String toString() {
        return dataMemberString;
    }

    public String getDataMemberString() {
        return dataMemberString;
    }

    public void setDataMemberString(String dataMemberString) {
        this.dataMemberString = dataMemberString;
    }
}

public class test1 {

    static void change(MyString s) {
        s.setDataMemberString("haha");
    }

    public static void main(String[] args) {
        MyString s = new MyString("wawa");
        change(s);
        System.out.println(s);
    }

}
快乐的小呆 2014-02-11
  • 打赏
  • 举报
回复
你得先理解传值和传址。 你在change(s);传的是s的值,所以s的值不会变。
日知己所无 2014-02-11
  • 打赏
  • 举报
回复
然后开始改代码 楼主的原始示例:
public class test  {
    static void change(String s){
        s= "haha";
    }
    public static void main(String args[]){
        String s = "wawa";
        change(s);
        System.out.println(s);
    }
}
在CSDN论坛中,可以使用下面的形式包裹代码,以让代码用相应语言的颜色高亮显示 下划线得自己去除,代码写在java和code间的那两个中括号之间 _[_c_o_d_e_=_j_a_v_a_]_[_/_c_o_d_e_]_
日知己所无 2014-02-11
  • 打赏
  • 举报
回复
先推荐两篇文章 1)JAVA 参数传递 http://blog.sina.com.cn/s/blog_5dd380b90100bvel.html 2)Java Swapping Using a Wrapper Class http://www.cs.utsa.edu/~wagner/CS2213/swap/swap.html
  • 打赏
  • 举报
回复
此s非彼s。
yvxiaoshuai 2014-02-11
  • 打赏
  • 举报
回复
public class Haha { static String change(String s){ s= "haha"; return s; } public static void main(String args[]){ String s = "wawa"; s=change(s); System.out.println(s); } } 这样就可以了
  • 打赏
  • 举报
回复
static void change(String s){ s= "haha"; } public static void main(String args[]){ String s = "wawa"; change(s); System.out.println(s); } 你这里相当于对main里的s啥也没做,怎么可能变?change里的s只是一个形参,main里的s才是实参。
  • 打赏
  • 举报
回复
上面看错了,应该说change里的s是个参数,跟main里的s不是一个东西
chengxu2011 2014-02-11
  • 打赏
  • 举报
回复
static void change(String s){ s= "haha"; } 这边传入的s是一个java栈的拷贝,然后s= "haha";把复制的s指向了另一个字符串haha,因为s只是一份拷贝,所以不影响原来的s,原来的s还是wawa
  • 打赏
  • 举报
回复
s是局部变量
Java狂魔 2014-02-11
  • 打赏
  • 举报
回复
System.out.print(谢谢大家打帮助")
Java狂魔 2014-02-11
  • 打赏
  • 举报
回复
[code=java_]System.out.print(谢谢大家打帮助")[/code]
现在很多做透明加解密的初学者都比较困惑,不知从何下手,我也是如此,从什么都不会开始,慢慢肯文件系统内幕,到OSR上面请教,四个月的时间还是收获颇丰。其实真正研究以后会发现,很多都是体力活,要不断的去跟踪文件的操作流程。在这里发一个基于minifilter的透明加解密的驱动源码仅供大家参考,其中也实现了对文件标识的处理,文件标识放在文件尾部。算是抛砖引玉吧。坦白的说,这个代码并不稳定(偶尔与norton杀毒软件会有冲突),但是我觉得整个流程是正确的,可能有些细节还没有考虑清楚,我觉得对初学者还是有一定帮助吧,当然大虾们可以跳过,呵呵。另外,有关加解密算法的代码由于不是我写的,也不好公开,所以我把相关代码用“\\\”给注释掉了(但没有去掉),请大家见谅,不过不会对整个流程产生影响。大家可以重点看一下各个派遣函数的实现。 欢迎大家拍砖,觉得有点意思就顶一下啊,在看代码的过程中如果有什么好的建议,也希望能告诉我。 最后非常感谢XiangXiangRen,zzbwang,neak47等网友在这段时间内对我的帮助。XiangXiangRen的书以及zzbwang的帖子对我完成这项工作有很大的帮助和参考价值,在此谨与大家分享。 编译环境:WDK6001.18002 XP x86 PS: 您可以将附件中的代码进行修改和转发,但转发时请注明出处。 http://bbs.driverdevelop.com/htm_data/39/1001/119736.html

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧