黑马程序员技术交流社区

标题: 这个困扰我(完成) [打印本页]

作者: 王琪    时间: 2014-2-27 21:12
标题: 这个困扰我(完成)
本帖最后由 王琪 于 2014-3-2 22:01 编辑
  1. <b>import java.util.*;
  2. public class Text {
  3.         static void fun(String s,int n,int b){
  4.                 String sbit="0123456789ABCDEF";
  5.                 if(n==0){
  6.                         s="!";
  7.                         return;
  8.                 }
  9.                 fun(s,n/b,b);
  10.                 System.out.println(s+" "+n+" "+n%b);
  11.                 ??//s+=new Character().toString(sbit.charAt(n%b)c);
  12.         }
  13.         public static void main(String[]args){
  14.                 String s="";
  15.                 int i,base,old;
  16.                 System.out.println("请输入:十进制数");
  17.                 Scanner in=new Scanner(System.in);
  18.                 old=new Integer(in.next().trim()).intValue();
  19.                 System.out.println("请输入转换的进制");
  20.                 in=new Scanner(System.in);
  21.                 base=new Integer(in.next().trim()).intValue();
  22.                 fun(s,old,base);
  23.                 System.out.println(s);
  24.         }
  25. }
  26. </b>
复制代码


1 String 怎么不是传地址啊?就是上面的s不是一个对象,最后输出为空啊
2 s+=..也不管用
3 ??//s+=new Character().toString(sbit.charAt(n%b)c);
4 上面的结果是这个

  1. 请输入:十进制数
  2. 121
  3. 请输入转换的进制
  4. 2
  5. 1 1
  6. 3 1
  7. 7 1
  8. 15 1
  9. 30 0
  10. 60 0
  11. 121 1
复制代码



System.out.println(s+" "+n+" "+n%b);   s没输出啊?

s+=  也没实现     不会了
  1. 这样也不对
  2. String sbit="0123456789ABCDEF";
  3.                 if(n==0){
  4.                         s="*";
  5.                         return;
  6.                 }
  7.                 fun(s,n/b,b);
  8.                 int len=s.length();
  9.                 System.out.println(s+" "+n+" "+n%b);
  10.                 s+=new String(sbit.toCharArray(),len+1,len);


复制代码

作者: 李金中    时间: 2014-2-28 16:25
你是想实现 String s = "";
然后在函数中对它赋值么?

那么你在函数内部改变它是不现实的。。。。它指向的内容是不能改变的,而java又不能去修改地址。所以不行。你可以通过返回值,见下:
public class StringFunc {
        public static void main(String[] args)
        {
                String s = "";
                s= ChangeStrTo();
                System.out.println(s);
        }
        public static String ChangeStrTo()
        {
                String sTemp = new String("Hello!");
                return sTemp;
        }
}

或者可以通过StringBuilder来改变内容,见下:
public class StringFunc {
        public static void main(String[] args)
        {
                StringBuilder s = new StringBuilder();
                ChangeStrTo(s);
                System.out.println(s);
        }
        public static void ChangeStrTo(StringBuilder strBuilder)
        {
                strBuilder.append("Hello!");
        }
}
==================================================
这块 估计不太好理解, 你要对地址和地址指向的内容有个很好的认识。地址也可以理解为所谓引用
作者: 王琪    时间: 2014-3-1 11:54
李金中 发表于 2014-2-28 16:25
你是想实现 String s = "";
然后在函数中对它赋值么?

太谢谢你啦。:)
我就是想通过地址改变,发现不行,除非在函数中传来的 句柄+[下标]改变  不能
  1. <b>fun(String s){
  2.   String s2="xinde ";  
  3.     s=s2;  //这好像是s有指向了新的对象,原来的就丢失了
  4. }</b>
复制代码
最后我用ArrayList集合试了这个可以,
  1. import java.util.*;
  2. import java.util.ArrayList;
  3. import java.util.ListIterator;
  4. public class Text2 {  
  5. static void  fun(ArrayList<font color="Red"><Character> a</font>){
  6.               <font color="Red">ListIterator it1=a.listIterator();</font>
  7.               char []c={ '1','2' ,'3','4' ,'5','6','7' };
  8.               for(char s:c){
  9.                      if(it1.hasNext()){
  10.                              it1.next();
  11.                              <font color="DarkOrchid">it1.set(new Character(s));</font>
  12.                              
  13.                      }
  14.                      else{break;}
  15.               }
  16.       }
  17. public static void main(String[]args){
  18.                 ArrayList<Character> a=new ArrayList<Character>();
  19.                
  20.                 char []c={ 'A','B' ,'C','D' ,'E' };
  21.                 for(char v:c){
  22.                         a.add(new Character(v));
  23.                 }
  24.                 <font color="Red">fun(a);</font>
  25.                 System.out.println(a);
  26.         }
  27.      }
复制代码

        其他数组传来不能用,比如下面的

  1. <b>void fun(int a []){
  2.    int []a2={1,2,3,4,5,6};
  3.    a=a2;
  4. }</b>
复制代码
发现
      1.C语言                                                                                             2java
#include <stdio.h>                                                                         class java{
void fun(char p[] ){//char *p                                                         void fun(  char [] p ){
    char code[]={'4','5','6','7'};                                                            char []code={'4','5','6','7'};
    p=code//此时p所指的对象本身发生了变化                                     p=code;   ///应该只是对象句柄转移
}                //如果参数改为char p[4]是传值像java的克隆                   }                   //不会干扰传来的a数组
void main(){                                                                                   public static void main(String[]args){
    char a[]={'1','2','3','4'};                                                                  char [] a={'1','2','3','4'};
     fun(  a );     printf("%s",a)   // 输出4567                                   fun( a );  System.out.println(new String(a));  //输出1234
}                                                                                                    }  }//System.out.println(a);将输出乱码地址

本来还想到通过 System类的arraycopy静态函数用于数组拷贝但还是不行
  1. import java.util.*;
  2. public class Text2 {
  3.         <b>static void fun(ch<font color="DarkRed">ar[] s)</font>{
  4.                 <font color="Red">char []b="AAA"</font>.toCharArray();
  5.                <font color="Red">System.arraycopy(s, 0,b ,0, 2); </font>
  6.                 }
  7.         public static void main(String[]args){
  8.                <font color="Blue">char []s="QQQ".toCharArray();</font>
  9.                 <font color="DarkRed">fun(s);</font>
  10.                <font color="Red">System.out.println(new String(s));</font>
  11.         }
  12. }
  13. 结果却是
  14. QQQ</b>
复制代码
但是如果通过您说的通过返回值来改变
  1. <b>  public static void main(String[] args)
  2.         {
  3.                 String s = "";
  4.                 <font color="DarkOrchid">s= ChangeStrTo();</font>
  5.                 System.out.printl<font color="DarkOrchid">n(s);</font>
  6.         }
  7.         public static<font color="DarkOrchid"> String</font> ChangeStrTo()
  8.         {
  9.                 String sTemp = new String("Hello!");
  10.                 return sTemp;
  11.         }</b>
复制代码
处理一个参数可以要是想处理多个参数就不能通过一个返回值来改变了 比如
  ____fun(int [ ] a ,char [ ] c, String s){
   ...
}

最后您有帮我找到了另一个方法就是
  1. <font color="DarkRed"><b>通过StringBuilder来改变内容,见下:
  2. public class StringFunc {
  3.         public static void main(String[] args)
  4.         {
  5.                 StringBuilder s = new StringBuilder();
  6.                 ChangeStrTo(s);
  7.                 System.out.println(s);
  8.         }
  9.         public static void ChangeStrTo(StringBuilder strBuilder)
  10.         {
  11.                 strBuilder.append("Hello!");
  12.         }
  13. }

  14. </b></font>
复制代码
谢谢你






作者: 王琪    时间: 2014-3-2 22:05
本帖最后由 王琪 于 2014-3-2 22:08 编辑
李金中 发表于 2014-2-28 16:25
你是想实现 String s = "";
然后在函数中对它赋值么?

对了,我又想了为啥不能通过函数间传地址来改变数组里的内容?
  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. }
复制代码



作者: 李金中    时间: 2014-3-2 23:24
本帖最后由 李金中 于 2017-8-30 17:41 编辑
王琪 发表于 2014-3-2 22:05
对了,我又想了为啥不能通过函数间传地址来改变数组里的内容?

要不你加我qq吧 我给你解释解释关于 函数传参的问题。

作者: 王琪    时间: 2014-3-2 23:46
好的谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2