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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王琪 于 2014-3-3 01:06 编辑

  1. package dom;
  2. import java.util.*;
  3. import java.util.ArrayList;
  4. import java.util.ListIterator;
  5. public class Text {  
  6. static void  fun(char[] a){
  7.               
  8.               char []c={ '1','2' ,'3','4' ,'5' };
  9.              a=c;
  10.               
  11.       }
  12. public static void main(String[]args){               
  13.                 char []c={ 'A','B' ,'C','D' ,'E' };
  14.                 fun(c);
  15.                 for(char z:c){
  16.                 System.out.print(z);
  17.                 }
  18.         }
  19.      //最后输出'A','B' ,'C','D' ,'E' 但我想让他变成12345
  20. }
复制代码

评分

参与人数 1黑马币 +5 收起 理由
何伟超 + 5

查看全部评分

8 个回复

倒序浏览
main 中C指向一块内存ABCD
然后fun(C)这一步操作,使得fun中的a 指向了这一块区域。
接着fun()中新建的变量 c指向新建的内存1234
然后通过赋值使得fun()中的a指向新的内存1234
fun函数执行完毕,fun()中的a,c内存1234被释放

以上过程中,main中的C始终是指向内存ABCD

然后for(char)输出main 中c指向区域的内容。
所以肯定是'ABCD'

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
  1. public class Demo_1 {
  2.         static void fun(char[] a) {

  3.                 char[] c = { '1', '2', '3', '4', '5' };
  4.                 a = c;
  5.                 for (char z : c) {
  6.                         System.out.print(z);
  7.                 }
  8.         }
  9.         public static void main(String[] args) {
  10.                 char[] c = { 'A', 'B', 'C', 'D', 'E' };
  11.                 fun(c);
  12.                
  13.         }
  14. }
复制代码

//这样就可以输出12345了.
//因为你那个函数返回时void,所以就可以不用返回给调用者了,在本方法了就可以做输出处理.
//其实你这原来已经是改变数组了,但你没有返回,也没有接受,所以你打印时就会出现主函数中的那个数组.

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
原理我好像明白了,但是我就想在主方法里输出,fun方法就管将新对像通过地址传递改变源对象怎么办?
  1. 发现
  2.       1.C语言                                                                                             2java
  3. #include <stdio.h>                                                                         class java{
  4. void fun(char p[] ){//char *p                                                         void fun(  char [] p ){
  5.     char code[]={'4','5','6','7'};                                                            char []code={'4','5','6','7'};
  6.     p=code//此时p所指的对象本身发生了变化                                     p=code;   ///应该只是对象句柄转移
  7. }                //如果参数改为char p[4]是传值像java的克隆                   }                   //不会干扰传来的a数组
  8. void main(){                                                                                   public static void main(String[]args){
  9.     char a[]={'1','2','3','4'};                                                                  char [] a={'1','2','3','4'};
  10.      fun(  a );     printf("%s",a)   // 输出4567                                   fun( a );  System.out.println(new String(a));  //输出1234
  11. }                                                                                                    }  }//System.out.println(a);将输出乱码地址
复制代码

回复 使用道具 举报
因为Java只有值传递,没有引用传递。你传递了复本然后改变复本的引用对于原来的数组是没有任何影响的,你必须要把复本所只想的地址中的内容改变才会对原数组造成改变。所以你的方法里应该有个遍历然后对每个元素赋值。
回复 使用道具 举报
java跟C不同,java是值传递的
  1. public class EasyTest4 {
  2.        
  3.         static char[] fun(char[] a){
  4.                 char []c={ '1','2' ,'3','4' ,'5' };
  5.                 a=c;
  6.                 return a;//返回数组a
  7.                 }
  8.         public static void main(String[]args){
  9.                 char []c={ 'A','B' ,'C','D' ,'E' };
  10.                 c=fun(c);
  11.                 for(char z:c){
  12.                         System.out.print(z);
  13.                         }
  14.                 }       
  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
乔青山 发表于 2014-3-2 23:21
因为Java只有值传递,没有引用传递。你传递了复本然后改变复本的引用对于原来的数组是没有任何影响的,你必 ...

哦 我明白了,终于明白了。。谢谢你:)
回复 使用道具 举报
twtzhongxin 发表于 2014-3-2 23:24
java跟C不同,java是值传递的

嗯,什么是值传递,引用传递啊?:)谢谢你
回复 使用道具 举报
我问的问题有点低级了,嘻嘻
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马