主题 : Java初学者都必须理解的六大问题
级别: 六星会员
UID: 656932
精华: 0
发帖: 13100
威望: 629 点
金钱: 1138 两
贡献值: 4 点
PW积分: 15 点
群组: 因为我们是NB青年!!
在线时间: 902(时)
注册时间: 2006-03-21
最后登录: 2009-07-02
楼主  发表于: 2006-05-19 22:21

Java初学者都必须理解的六大问题

对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。

  问题一:我声明了什么!


  String s = "Hello world!";

  许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。

  这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:


  String string = s;

  我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。

   问题二:"=="和equals方法究竟有什么区别?

  ==操作符专门用来比较变量的值是否相等。比较好理解的一点是:


  int a=10;
  int b=10;

  则a==b将是true。

  但不好理解的地方是:


  String a=new String("foo");
  String b=new String("foo");

  则a==b将返回false。

  根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。

  对象内容的比较,正是equals方法做的事。

  看一下Object对象的equals方法是如何实现的:


  boolean equals(Object o){

  return this==o;

  }

  Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。

  看一下一个极端的类:


  Class Monster{
  private String content;
  ...
  boolean equals(Object another){ return true;}

  }

  我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。

  所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。
  
  问题三:String到底变了没有?

  没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:


  String s = "Hello";
  s = s + " world!";

  s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

  通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
级别: 初来乍到
UID: 743358
精华: 0
发帖: 4
威望: 0 点
金钱: 4 两
贡献值: 0 点
PW积分: 0 点
在线时间: 0(时)
注册时间: 2006-05-25
最后登录: 2006-06-01
沙发  发表于: 2006-05-29 16:56

不错
希望我以后能够理解
独身で暮らしている。
级别: 六星会员
UID: 1044
精华: 9
发帖: 51662
威望: 20761 点
金钱: 13020 两
贡献值: 2123 点
PW积分: 15 点
群组: 因为我们是NB青年!!
在线时间: 3787(时)
注册时间: 2003-11-26
最后登录: 2009-07-03
地毯  发表于: 2006-06-05 13:39

JAVA还老早学过点,快忘了
级别: 新手上路
UID: 763331
精华: 0
发帖: 89
威望: 0 点
金钱: 27 两
贡献值: 0 点
PW积分: 0 点
在线时间: 0(时)
注册时间: 2006-06-09
最后登录: 2006-06-09
3楼  发表于: 2006-06-09 03:43

中国华北黑客联盟http://bbs.hbhacker.net免费学习黑客技术平台联合中国新世纪站长学院http://www.chxy.cn/dzbbs/努力推动特色文化,整合计算机专业与网络安全技术。
奖励原则:
华北黑客联盟永不开设VIP教学制度。均可申请免费的200M的FTP空间和http空间,同时可申请参加免费安全技术培训课程(一年两期,寒假和暑假各一期,讲师均为大型黑客站点讲师)。优秀会员或两站工作人员均可获得每月一期的黑客X杂志和免费空间!最新漏洞信息,最新入侵原理和动画教程等均免费下载!~
中国新世纪站长学院,集合目前主流的论坛系统:动网论坛风格模板、PHPDZ论坛风格模板、PHPWIND论坛风格模板,集中免费发布,各类论坛插件均提供免费下载,同时免费提供各类精品代码。各下载软件均经过华北黑客联盟技术测试,站长学院郑重承诺,如各类风格无演示图片或地址均不提供下载!各类站点的源程序和代码如果有功能限制或是后门木马之类的均不提供下载!同时学院论坛提供ASP、ASP.NET、PHP基础入门学习资料和各类视频教程、电子书下载。
同时,华北黑客联盟www.hbhacker.net新世纪站长学院www.chxy.cn/dzbbs/和GoPlays游戏网联合推广web空间,推动网络平民化进程,1G全能空间一年266元,mysql数据库无限用!安全第一,建站不应该被黑!免费帮助提供建站技术支持和站点安全问题!
华北黑客联盟QQ群号:22640851   20486630
新世纪站长学院群号:22785253   1257724   13992316
GoPlays游戏网群号:17620946
一天24小时免费技术支持!同时得到华北黑客联盟技术支持!
级别: 初来乍到
UID: 768279
精华: 0
发帖: 1
威望: 0 点
金钱: 1 两
贡献值: 0 点
PW积分: 0 点
在线时间: 0(时)
注册时间: 2006-06-13
最后登录: 2006-06-13
4楼  发表于: 2006-06-13 11:18

ddddddddddddd
级别: 一星会员
UID: 768231
精华: 0
发帖: 107
威望: 0 点
金钱: 70 两
贡献值: 0 点
PW积分: 0 点
在线时间: 5(时)
注册时间: 2006-06-13
最后登录: 2006-08-07
5楼  发表于: 2006-06-13 13:19

帮顶一下了
域名60空间优惠,招代理理。www.eanidc.com
Eays Network 易思网络
级别: 二星会员
UID: 300697
精华: 0
发帖: 308
威望: 17 点
金钱: 58 两
贡献值: 0 点
PW积分: 15 点
在线时间: 163(时)
注册时间: 2005-05-27
最后登录: 2009-06-20
6楼  发表于: 2006-06-14 20:14

不错。。
Eays Network 易思网络http://www.eays.cn QQ:247081126 http://www.eays.cn/style/info/link.asp
级别: 初来乍到
UID: 770976
精华: 0
发帖: 2
威望: 0 点
金钱: 2 两
贡献值: 0 点
PW积分: 0 点
在线时间: 0(时)
注册时间: 2006-06-15
最后登录: 2006-06-15
7楼  发表于: 2006-06-15 08:38

好文章。
Borland中文社区
http://www.borlandbbs.cn