补充1# 1,继承object的类默认都有toString()方法,有的类改写了toString()方法。导致equals和==有本质的不同。 比如: Integer I = new Integer(5); Integer I2 = new Integer(5); System.out.println(I==I2); System.out.println(I.equals(I2)); 结果如何。== 个人认为是引用地址的比较。 2,抽象类和接口也是有区别的。 1)抽象类可以在类中声明实例字段,而接口不能拥有,但是接口指定常量却可以。 2)声明对象时类 A a = new A(),而接口 InterfaceA a = new InterfaceA()确实错误的。 实际中用接口比较多。楼下的,有错误请指正。smile.
十分形象,根据对象重写后的equals方法可以知道,他比较的是两个对象的值是否相等 /** * 这是Integer对象中equals方法JDK的源码 * Compares this object to the specified object. The result is * <code>true</code> if and only if the argument is not * <code>null</code> and is an <code>Integer</code> object that * contains the same <code>int</code> value as this object. * * @param obj the object to compare with. * @return <code>true</code> if the objects are the same; * <code>false</code> otherwise. */ public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
2.抽象类里有抽象方法和普通方法,,接口里全是抽象方法
return (this == obj);//证明.内部用的就是==符号
}
但是每个类可以重写equals方法,可满足自己的需求,就是说可以实现跟==不同的功能!2.接口是一个特殊的抽象类,就是全部的方法都为抽象的,抽象类中有抽象的方法,也有实现好的方法,就是接口和类之间的中间物,可以这么理解,设计模式方面不应该这么理解了,呵呵,考虑到很多问题
1,继承object的类默认都有toString()方法,有的类改写了toString()方法。导致equals和==有本质的不同。
比如:
Integer I = new Integer(5);
Integer I2 = new Integer(5); System.out.println(I==I2);
System.out.println(I.equals(I2));
结果如何。== 个人认为是引用地址的比较。
2,抽象类和接口也是有区别的。
1)抽象类可以在类中声明实例字段,而接口不能拥有,但是接口指定常量却可以。
2)声明对象时类 A a = new A(),而接口 InterfaceA a = new InterfaceA()确实错误的。
实际中用接口比较多。楼下的,有错误请指正。smile.
==是引用的比较接口是一种契约,实现接口就要实现所有的方法,规定你必须做什么
抽象类是一种可以选择的,提供你很多的方法,你可以自己决定使用什么
初学者,我的理解也是这样
public boolean equals(Object obj) { return (this == obj);//证明.内部用的就是==符号 }
==是比较两个对象是否恒等,不仅比较对象的数据,也比较对象的内存地址。
但是每个类可以重写equals方法,可满足自己的需求,就是说可以实现跟==不同的功能! 例如:String类就重写了equals()方法,使之用于比较两个字符串的数据,而非对象的内存地址!
2.关于abstract class与interface,原理上比较复杂,可以参考下面内容:
1) 抽象的意义
在大型工程中,实现的技术比较复杂,模块多,代码量大,涉及编程的相关人员较多,角色和任务也不尽相同,为了合理安排软件工程的开发工作,需要一部分资深程序员先对程序框架做整体设计,然后其他程序员在建立好的框架基础上再做更细致的编程,就好比"建一座大厦要先建好钢筋混凝土框架再垒墙砖"一样,抽象类和方法就是起到"建立框架"的作用。
类似的,接口是一个更"纯粹"的抽象类,使用接口可以很好的克服Java不支持多继承父类的限制,达到多继承的效果。
接口和抽象类类似,只是接口更关心功能组成,而不关心功能的实现,这部分工作由继承它们的具体子类完成。
2) 应用时如何选择抽象类或接口?
如何选择该使用抽象类还是接口?这是一个比较有深度的问题!我们可以从两个角度考虑此问题:
其一:从代码的使用上考虑如何选择。
接口与抽象类的区别如下:
Ø 接口是一种“纯粹”的抽象类,它所有的方法都是抽象的(即只有声明,没有定义);而抽象类可以允许包含有定义的方法;
Ø 子类可以实现多个接口,但只能继承一个抽象类;
Ø 一个子类如果实现了一个接口,那么子类必须重写这个接口里的所有方法;抽象类的子类可以不重写抽象父类的所有方法,甚至可以不重写抽象父类的抽象方法,但这个子类会自然成为抽象类。
通过上面的对比,我们知道在代码的使用上如何选择使用抽象类还是接口。当然,需要重点提出的是:因为抽象类的子类可以不重写抽象父类的所有方法,所以有时使用抽象类代码更简练(例如后面要讲述的适配器类);而在另外一些情况下(比如要实现多继承效果),就必须要使用接口了。
其二:从构架程序的设计思想的角度上考虑如何选择。
抽象类的作用是实现行为,而不是定义行为,构建应用工程时如果需要定义行为,那么最好由接口来完成。比如,要创建一个程序构架,这个构架将由一些紧密相关的类构成,且所有类都会共享一个公共的行为实现,就可以使用抽象类。如果要创建将由一些不是由这些类对象必须采用的功能,就最好使用接口。
楼主截止到2008-06-19 10:05:51的汇总数据:
注册日期:2008-5-4
上次登录:2008-6-5
发帖数:26
结贴数:0
结贴率: 0.00%
如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
接口中只能定义抽象方法。用法上我也说不太清楚,免得误人子弟,我也是新手!
不同意这种观点,在Object 两者是一样的,只是看你的实现方法而已。
任何类都继承自Object类,如果不覆盖它的equals方法,比较的永远是地址。
抽象类可以有非抽象方法,接口中只能定义抽象方法。
* 这是Integer对象中equals方法JDK的源码
* Compares this object to the specified object. The result is
* <code>true</code> if and only if the argument is not
* <code>null</code> and is an <code>Integer</code> object that
* contains the same <code>int</code> value as this object.
*
* @param obj the object to compare with.
* @return <code>true</code> if the objects are the same;
* <code>false</code> otherwise.
*/
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}