免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Java 问题
12下一页
最近访问板块 发新帖
查看: 1890 | 回复: 13
打印 上一主题 下一主题

问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-31 23:49 |只看该作者 |倒序浏览
public class ArrayCopy
{
public static void main(String arg[])
{//new three string-array
  char str1[]={'M','y',' ','S','t','r','i','n','g'};
  char str2[]=new char[20];
  char str3[]=new char[20];
  System.out.println("str1: "+str1);//为什么和下一句有区别
  System.out.println(str1);
  str2=str1;
  System.out.println("str2: "+str2);

  System.arraycopy(str1,3,str3,0,str1.length-3);
  System.out.println("str3: "+str3);
  System.out.println(str3);
  str1[3]='k';
  System.out.println("\nstr1[3]='k'");
  System.out.print("str3: "+str3);
}

}

论坛徽章:
0
2 [报告]
发表于 2006-01-01 00:34 |只看该作者
System.out.println("str1: "+str1);//为什么和下一句有区别
System.out.println(str1);

至少看上去长短都不同啊

论坛徽章:
0
3 [报告]
发表于 2006-01-01 14:18 |只看该作者
麻烦大哥在机子上运行一下,谢谢!

论坛徽章:
0
4 [报告]
发表于 2006-01-01 14:26 |只看该作者
Ii's corrent.because the operation symbol has been overrided.

论坛徽章:
0
5 [报告]
发表于 2006-01-01 16:37 |只看该作者
我 觉得不是这个问题,你门要在自己的jbuilder里试试看

论坛徽章:
0
6 [报告]
发表于 2006-01-01 17:48 |只看该作者

  1.   System.out.println("str1: " + str1);//为什么和下一句有区别
  2.   System.out.println("str1: " + str1.getClass() + "@" + Integer.toHexString(str1.hashCode()));//和上一句比较
  3.   System.out.println(str1);
  4.   System.out.println("str1: " + new String(str1));//也和上一句比较
复制代码

懒得解释,像LZ这样有刨根问底的精神,比较一下应不难理解吧。

[ 本帖最后由 caojiqun 于 2006-1-1 17:52 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2006-01-01 20:46 |只看该作者
System.out.println("str1: " + str1);// 等价于 System.out.println("str1: "+(String)str1);
System.out.println(str1); //等价于 System.out.println(char[] str1);
               
str2 = str1;
System.out.println("str2: " + str2); //java不是c++,不能进行指针操作,凡是你看到类似[C@35ce36这样的结果通常就是强制转换内存地址为String的结果

论坛徽章:
0
8 [报告]
发表于 2006-01-01 20:58 |只看该作者
原帖由 perryhg 于 2006-1-1 20:46 发表
System.out.println("str1: " + str1);// 等价于 System.out.println("str1: "+(String)str1);
System.out.println(str1); //等价于 System.out.println(char[] str1);
               
str2 = str1;
...

看来也是想当然,不知是否编译执行试过?
System.out.println("str1: "+(String)str1);
编译都通不过(JDK 1.5)!
System.out.println(str1); //就是 System.out.println(char[] str1);

[ 本帖最后由 caojiqun 于 2006-1-1 21:00 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2006-01-02 14:09 |只看该作者
是哦,我只是举个例子,没有让你真的去编译,目的是告诉你在java里面
System.out.println("str1: " + char[]) 这种语句是完全没有意义的。
System.out.println(...)是个功能非常强大的函数,如果你看过java的文档,println(...)里面可以使用许多不同类型的参数,而println会自动把它们转换成我们可以阅读的输出格式。因为java是强类型的语言,在操作上类型不会自动转换,除非你强制转换,但是在输出的时候,不同类型对应的转换和访问数据的方法不同。在这里,java就体现了它作为OO语言的重大特性:重载(overload),println方法的重载使得java可以根据输入的类型自动判断需要处理的方法。

在我的理解中,"aaa "+ bbb 这样的语句,在运行中,因为"aaa " 是String,对String采用 "+" 符号在java中意味着字符串连接,如果你的bbb不是字符串,java就会通过某种方法将其隐式转换为字符串。这样以来,java就用了处理普通字符串的方法来处理char[],就造成了转换失效。这样的例子在java的序列化、反序列化中很常见,如果是直接输出,你就会看到类似于[C@35ce36这样的结果,如果是class类型转换,就会产生ClassCastException。

我只知道java和c++不同,在java里面,String并不等同于char[]。如果你问我为什么会出这样的结果,这个我也回答不上来。如果你研究的对象是jvm和java的编译器和java的class文件的格式,那么我还没有研究到这样的深度,我倒是要反过来向您请教。

[ 本帖最后由 perryhg 于 2006-1-2 14:12 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-01-17 18:31 |只看该作者
看到你门热情的回答,和我同样具有那种强列的求知精神,本人在此谢过了,最近由于个人原因没有上网,实在不好意思,你们对我的帮助我都有认真的是过,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP