A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 包晗 中级黑马   /  2013-6-4 19:37  /  1650 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class TestString
  2. {
  3.     String str = new String("good");
  4.     char[] ch  = { 'a', 'b', 'c' };

  5.     public static void main(String[] args) {
  6.         TestString ex = new TestString();
  7.         ex.change(ex.str, ex.ch);
  8.         System.out.print(ex.str + " and ");
  9.         System.out.print(ex.ch);
  10.     }

  11.     public void change(String str, char ch[]) {
  12.         str = "test ok";
  13.         ch[0] = 'g';
  14.     }
  15. }
复制代码
水一把 嘿嘿

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 神之梦 于 2013-6-4 20:10 编辑

楼主如果这样写的话,应该就是楼主要的答案了,至于为什么??????
  1. public class Test
  2. {
  3.     String str = new String("good");
  4.     char[] ch  = { 'a', 'b', 'c' };

  5.     public static void main(String[] args) {
  6.         Test ex = new Test();
  7.         ex.str=ex.change(ex.str, ex.ch);
  8.         System.out.print(ex.str + " and ");
  9.         System.out.print(ex.ch);
  10.     }

  11.     public String change(String str, char ch[]) {
  12.       
  13.         ch[0] = 'g';  return str = "test ok";
  14.     }
  15. }
复制代码
楼主在方法中重新给ex.str重新赋了值,但是没有返回,
str 是一个对象的引用,因为String类的特殊性,你不能改变字符串这个对象。
在change方法中将str指向了一个新的字符串对象。但是这个方法执行完了,str的重新指向也就挂了。
所以这里加返回的话,才能实现。数组的对象存在于堆内存中,对于数组的操作,我想应该不用多解释了吧。。。。。。。。。。。。。。。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
public void change(String str, char ch[]) {
//这个str是你传入的参数str
        str = "test ok";
        ch[0] = 'g';
    }
这段代码错误,你的意思是把 "test ok"赋值给对象ex的变量str吧
你应该加this.来实现  你的第二句是把类中的ch[0]赋值成‘g’,但是你传入一个char类型的参数ch[] 做什么?我看不明白
public void change(String str, char ch[]) {
        this.str = "test ok";
//传入的参数 ch[]没用,str也用
        ch[0] = 'g';
    }

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
简单的说:
public void change(String str, char ch[]) {
        str = "test ok";
        ch[0] = 'g'; }
你没有返回值;所以ex.str 依旧是good ;至于数组,是引用型的;你把角标为0的数组元素重新赋值g,地址没变,但是堆内存中值变了,所是gbc

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
public class TestString
{
    String str = new String("good");
    char[] ch  = { 'a', 'b', 'c' }
    public static void main(String[] args) {
        TestString ex = new TestString();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }
    public void change(String str, char ch[]) {
       str = "test ok";
        ch[0] = 'g';
    }
}

楼主:
1、你要明白局部变量与成员变量的用法,当成员变量名与函数局部变量名重名时,默认使用局部变量,若想使用成员变量要用this,因此:
public void change(String str, char ch[]) {
        str = "test ok";//此时的str是局部变量,即用红色标出的,是同一个局部变量,与上文定义的成员变量无关,此时局部变量str值为test ok。
                                     //对象ex的成员变量str值仍然为good。
        ch[0] = 'g';//在这里,ch[0]是上文的成员变量,其值为a,因为局部变量char ch[] 只是定义了char类型的引用,其值为null,不可能是ch[0].因此成员变量ch值为gbc。
2、在代码中用红色标出的是同一个变量,用蓝色标出的是同一个变量。
    }

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马