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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩冬 中级黑马   /  2013-6-29 22:51  /  1543 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙百鑫 于 2013-7-1 07:19 编辑

public class Example{
  String str=new String("good");
  char[]ch={'a','b','c'};
  public static void main(String args[]){
    Example ex=new Example();
    ex.change(ex.str,ex.ch);
    System.out.print(ex.str+" and ");
    Sytem.out.print(ex.ch);
  }
  public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
  }
}

这个题目的结果是good and abc 还是good and gbc啊?感觉好混乱,有没有高手给解释一下啊,在线等。。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
乱78糟的代码,错误数不清.首先,你的CHANGE方法是非静态的,主函数无法调用.而且看你想要的答案应该是进行字符串和字符连接,可你字符数组又没进行遍历.怎么操作?

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
秩宇 来自手机 中级黑马 2013-6-29 23:18:48
藤椅
Good and abc
形式参数属于局部变量,出了方法就失效了

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报 0 1
肥猫 发表于 2013-6-29 23:09
乱78糟的代码,错误数不清.首先,你的CHANGE方法是非静态的,主函数无法调用.而且看你想要的答案应该是进行 ...

虽然是change方法是静态方法,但是有在主函数中创建该类的实例对象,所以通过对象调用非静态方法。
答案是: good and gbc吧,1、因为当给方法传递数组或集合变量引用时,在方法中可直接操作原先堆内存中的数据;2、而String以及基本数据类型等的变量引用传递给方法时会在方法中创建属于方法的局部变量引用,因此test ok赋值无效。(这是特殊的参数传递应用,在高新技术部分有提及)。
3、不需遍历是因为那个数组是char[]数组,因为直接打印数组变量会调用toString()方法,而char[]的toString方法就是以字符串形式打印数组中全部元素。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
zms2100 发表于 2013-6-30 00:48
虽然是change方法是静态方法,但是有在主函数中创建该类的实例对象,所以通过对象调用非静态方法。
答案 ...

这个题我也有点迷惑,为什么对象调用change方法没有为成员变量附上值呢?如果我想调用这个方法让它赋上值该如何更改这个程序?
回复 使用道具 举报
王广亚 发表于 2013-6-30 10:51
这个题我也有点迷惑,为什么对象调用change方法没有为成员变量附上值呢?如果我想调用这个方法让它赋上值 ...

调用方法为成员变量赋值?你指的是不是传递String str,虽然在方法中进行赋值但是却没有被改变?
以下算是提醒,呵呵:  1、调用方法为成员变量赋值,在标准创建一个带成员变量的Java类时通过都会要求编写setXXX()和getXXX()方法(高新技术部分会说明符合这种格式的类可以叫做JavaBean,就可以调用JavaBean类中的特有功能,题外话),方法代码:  
public  void setXXX(String str){
    this.str = str;    //即将接收的str参数数据传递给同名的成员变量的str,this是指向该类的对象引用;
}
2、如果那个变量不是成员变量,那么就可以通过返回值的方式,将新的字符串数据返回,由原来的那个变量引用接收,例:   String sss = person.getSSS();   ,这些应该都记得的,算是提醒复习吧,O(∩_∩)O~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马