注册
 找回密码
 注册
江西广告网
查看: 979|回复: 1
打印 上一主题 下一主题

Java入门--关于

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-1-9 09:37:43 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
eqauls 与 = =之异同   1)比较方式角度:   = =是面向过程的操作符;equals是面向对象的操作符   = =不属于任何类,equals则是任何类(在Java中)的一个方法;   我们可以1)Primitive1 (基本类型)= = Primitive2(基本类型);   2)Object Reference1(对象引用)= = Object Reference2(对象引用)   3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))   这三种比较   但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));   对于基本类型,没有面向对象中发送消息一说,自然也不会有   方法成员。   2)比较目的角度:   1) 如果要比较两个基本类型是否相等,请用= =;   2) 如果要比较两个对象引用是否相等,请用= =;   3) 如果要比较两个对象(逻辑上)是否一致,请用equals;   对两个对象(逻辑上)是否一致的阐释:   有人会问:在C 中, 比较两个对象相等不是也可以用==吗?我知道您是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是“ ”,“ =”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由 equals()来实现 。   这个“逻辑上”其实就取决于人类的看法,实际开发中,就取决于用户的需求;   有人会有看法:“取决于人类的看法”太过宽泛和不严肃,如果某人要两件   风牛马不相及的事物也相等,equals是否也能作出这样的比较呢?我们说可以的   下面这个例子说明了这一点:   class Horse {   String Type;   int Legs;   //相等的标准:腿的数目相等   public boolean equals(Object o){   if(this.Legs==((Cattle)o).Legs){   return true;   }   return false;   }   public Horse(String Type,int legs){   this.Type=Type;   this.Legs=legs;   }   }   class Cattle   {   String Type;   int Legs;   //相等的标准:腿的数目相等   public Cattle(String Type,int legs){   this.Type=Type;   this.Legs=legs;   }   public boolean equals(Object o){   if(this.Legs==((Horse)o).Legs){   return true;   }   return false;   }   }   public class EqualsTest{   public static void main(String[] args)   {   Cattle c=new Cattle("I'm the Cattle",4);   Horse h=new Horse("I'm the Horse",4);   if(c.equals(h)){   System.out.println(c.Type);   System.out.println(h.Type);   System.out.println("Cattle Equals Horse");   }   }   } 输出结果:"I'm the Cattle"   "I'm the Horse"   "Cattle Equals Horse"   您瞧瞧:牛果真等于了马,为何相等?因为我们定义的相等标准是:腿的数目相等;您会说:“这太滑稽”,是滑稽,可这是人类的看法,计算机可没有滑稽的概念,当然也没有“不滑稽”的概念,我们定义了什么相等标准,他就踏踏实实的为我们实现了;   所以说:相等标准(即需求)一定要定好,否则,滑稽的事可就多了   第三节:equals()缘起:   equals()是每个对象与生俱来的方法,因为所有类的最终基类就是Object(除去Object本身);而equals()是Object的方法之一。   我们不妨观察一下Object中equals()的source code   public boolean equals(Object obj) {   return (this == obj);   } 注意 “return (this == obj)”   this与obj都是对象引用,而不是对象本身。所以equals()的缺省实现就是比较   对象引用是否一致;为何要如此实现呢? 前面我们说过:对象是否相等,是由我们的需求决定的,世界上的类千奇百怪(当然,这些类都是我们根据模拟现实世界而创造的),虽然Object是他们共同的祖先,可他又怎能知道他的子孙类比较相等的标准呢?但是他明白,任何一个对象,自己总是等于自己的,何谓“自己总是等于自己”呢,又如何判断“自己总是等于自己”呢?一个对象在内存中只有一份,但他的引用却可以有无穷多个,“对象自己的引用1=对象自己的引用2”,不就能判断“自己总是等于自己”吗?所以缺省实现实现自然也就是   “return (this == obj)”;   而到了我们自己编写的类,对象相等的标准由我们确立,于是就不可避免的要覆写   继承而来的public boolean equals(Object obj);   如果您有过编覆写过equals()的经验(没有过也不要紧),请您思考一个问题:   “两个对象(逻辑上)是否一致”实际上是比较什么?没错,或许您已脱口而出:   就是对象的属性(即field,或称数据成员)的比较。方法是不可比较的哦。(这个问题是不是有些弱智呢?哈哈)   第四节:对一个推论的思考   推论如下:一言以蔽之:欲比较栈中数据是否相等,请用= =;   欲比较堆中数据是否相等,请用equals;   因为(根)基本类型,(根)对象引用都在栈中; 而对象本身在堆中;   这句话又对又不对,问题出在哪,就是“数据”二字,先看栈中,数据或为基本类型,或为对象引用,用==比较当然没错;但是堆中呢?对象不是堆中吗?不是应该用equals比较吗?可是,我们比较的是堆中“数据”,堆中有对象,对象由什么构成呢?可能是对象引用,可能是基本类型,或两者兼而有之。如果我们要比较他们,该用什么呢,用”equals()”?不对吧,只能是”= =”!所以正确的结论是:欲比较栈中数据是否相等,请用= =; 欲比较堆中数据是否相等,请用equals;   因为(根)基本类型,(根)对象引用都在栈中(所谓“根”,指未被任何其他对象所包含); 而对象本身在堆中。

该用户从未签到

2
发表于 2009-2-24 02:35:04 | 只看该作者

精诚教育代办学历,招生,培训.

http://www.jceduzx.com.cn北京精诚教育学历服务培训中心长期代办上网文凭 大学文凭 代考 助考 职业学历教育.客服电话:025-86872373,业务手机:13912948049咨询QQ:875627926 中心官网http://www.jceduzx.com.cn本中心代办出来的文凭是各个大学内部办理出来的。包括专科、本科文凭、学位证书,类型有统招(普通高校)毕业文凭和成人教育(成大、函授、自考、夜大、在职研究生等)。我们代办的学历文凭均属于真实文凭。在毕业大学有学籍、档案,在教育部门有备案和电子注册档案(能登陆中国高等教育学生信息网 www.chsi.com.cn上查询),终身有效!!! 客服电话: 025-86872373 曹老师 业务手机: 13912948049 咨询QQ: 875627926 报名学历电子邮箱: jceduzx@126.com 中心网址: http://www.jceduzx.com.cn
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表