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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 燿陚√揚葳 中级黑马   /  2014-7-9 12:07  /  1695 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 燿陚√揚葳 于 2014-7-9 21:54 编辑

  1. <P>public class Demo {</P>
  2. <P> public static void main(String[] args) {
  3.   String[] strs={"123","456","789","abc"};
  4.   String s="001";
  5. apple(strs,s);
  6.   System.out.print(s);
  7. }</P>
  8. <P>public static<T> void apple(T[] a,T obj){
  9.   for(int x=0;x<a.length;x++){
  10.    obj=a[x];
  11. //   System.out.println(obj);
  12.   }
  13. }</P>
  14. <P>}</P>
复制代码
初始化String为001,后来调用apple方法,这个方法不是相当于s=strs[1]="456"这个样子的吗?指向不是已经从001改为指向456了吗?可是为什么打印s还是原来的值001呢,还请大家详细告知一下谢谢了!

3 个回复

倒序浏览
本帖最后由 fantacyleo 于 2014-7-9 13:14 编辑

怎么可能改指向呢?Java的方法参数是值传递,方法内不可能改变传入参数本身的值。所以apple方法中的obj保存的不是s的地址,而是s的值,也就是字符串“001”的地址。你改的是obj的值(指向),不影响s的值(指向)
回复 使用道具 举报
fantacyleo 发表于 2014-7-9 13:09
怎么可能改指向呢?Java的方法参数是值传递,方法内不可能改变传入参数本身的值。所以apple方法中的obj保存 ...

感谢你的帮助!:lol

那数组为什么可以改变他的原数据呢?
数组的打印结果是111*bbb*ccc*ddd*eee*fff*,这是怎么回事啊?还请告诉一下谢谢了!

  1. <P>public static void main(String[] args) {
  2. </P>
  3. <P>  
  4.   String[] strs={"aaa","bbb","ccc","ddd","eee","fff"};
  5.   show(strs);
  6.   for(String str:strs){
  7.    System.out.print(str+"*");
  8.   }
  9.   }</P>
  10. <P> </P>
  11. <P>public static void show(String[] args){
  12.   for(int x=0;x<args.length;x++){
  13.    if(args[x]=="aaa")
  14.     args[x]="111";
  15.   }
  16. }</P>
复制代码

回复 使用道具 举报
燿陚√揚葳 发表于 2014-7-9 17:46
感谢你的帮助!

那数组为什么可以改变他的原数据呢?

Java中的数组也是对象。你的程序中,strs的创建用的大括号只是一种简写,完整写法应该是
  1. String[] strs = new String[6];
  2. strs[0] - "aaa";
  3. strs[1] = "bbb";
  4. strs[2] = "ccc";
  5. strs[3] = "ddd";
  6. strs[4] = "eee";
  7. strs[5] = "fff";
复制代码

也就是说,java中的数组实际上和对象一样,是new出来的。new就表示在堆中开辟了空间。因此,strs的值是堆中数组的地址,而不是数组元素本身
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马