Posted on 2009-05-21 20:59
eric_xu 阅读(213)
评论(0) 编辑 收藏 所属分类:
Java
接口定义了对某个特定对象所能发出的请求。
对象是服务提供者
protected成员限于自己和子类访问
覆写(override)与重载(overload)
重载:方法名必需相同,参数列表必需不相同,返回值类型可以不同
覆写:方法名必需相同,参数列表必需相同,返回值类型必需相同
看了一下java tutorial里面对接口的定义,底下附1:接口是抽取相互之间没有关系的类的共同特征,而不用去关注类之间的关系。
我觉得这个是接口和抽象类最关键的区别,接口是希望一组没有层次关系的类之间可以拥有共同的行为,而抽象类作为父类的话,自然希望其子类在逻辑上和父类是有一定的关系的。比如说一个抽象类,bird,里面有fly这个方法。我们现在想设计一架飞机也可以飞,虽然我们可以让plane这个类继承bird这个 抽象类,但是这两个完全是风马牛不相及的东西,自然不应该有继承关系了。但如果是接口设计的话,我们可以设计出一个flyable的接口,里面定义fly 的方法,因为bird和plane都可以飞,所以我们可以让鸟和飞机类去implement这个flyable的接口,然后各自实现不同的fly的方法。
java tutorial还有一个例子,比如说商店有若干种商品,各种商品之间一般不会有什么继承关系,但是现在店主希望管理各种商品,所以店主希望所有的商品都实现一种可以称为manageable的接口,里面包含用于管理的一些方法和属性,如价格、索引号这样的属性或者设置零售价格这样的方法。这样接口就巧妙地将各种不相关的类联系起来了。如果各种各样的商品类implement了manageable接口,那么店主只需要面向manageable这个接口就可以管理各种商品了,而不需要考虑各种商品之间是否有什么层次关系。所以接口给编程以极大的灵活性,而常说的面向接口编程大概是这个意思吧。
Java中还有一些常用接口,比如说comparable接口,任何类只要实现了这个接口,都可以被compare。
附2、4个人感觉都是基于1的。不过附3,看不太懂,是什么意思。附4讲到了可以通过接口实现多重继承,Java的接口也突破了单继承的限制,可以通过implements多个接口实现多重继承。不过个人感觉接口志不在此,只是在语法上达到了这样的效果。
总结一下,抽象类是一种类是对一组具有相同属性和方法的逻辑上有关系的事物的一种抽象。而接口则是对一组具有相同属性和方法的逻辑上不相关的事物的一种抽象。
附:You use an interface to define a protocol of
behavior that can be implemented by any class anywhere in the class hierarchy.
Interfaces are useful for the following:
1.Capturing similarities among unrelated classes
without artificially forcing a class relationship
2.Declaring methods that one or more classes are
expected to implement
3.Revealing an object's programming interface
without revealing its class
4.Modeling multiple inheritance, a feature of
some object-oriented languages that allows a class to have more than one
superclass
后期绑定,当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值类型检查,但并不知道将被执行的确切代码。
为了执行后期绑定,Java使用一小段特殊代码来替代绝对地址调用。在Java中,动态绑定是缺省行为。
将导出类视为基类的过程为向上转型(upcasting)。
在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class。
1 多态只针对非final方法;
不针对变量、final方法
2方法[非final]是运行时对应对象
变量、fianl是编译期间对应对象
3多态只能调用父类中有的方法(向上扩展后)
不能调用父类中没有的方法;
不能调用子类中扩展父类[not overridding]方法
4多态定义:指的是使用同一个实现接口,以实现不同的对象实例
多态好处:多态让程序依赖接口或者抽象类,而不是具体类
1.Java中除了static和final方法外,其他所有的方法都是运行时绑定的。private方法都被隐式指定为 final的,因此final的方法不会在运行时绑定。当在派生类中重写基类中static、final、或private方法时,实质上是创建了一个新的方法
2.在派生类中,对于基类中的private方法,最好采用不同的名字。
3.包含抽象方法的类叫做抽象类。注意定义里面包含这样的意思,只要类中包含一个抽象方法,该类就是抽象类。抽象类在派生中就是作为基类的角色,为不同的子类提供通用的接口。
4.对象清理的顺序和创建的顺序相反,当然前提是自己想手动清理对象。
5.在基类的构造方法中小心调用基类中被重写的方法,这里涉及到对象初始化顺序。
6.构造方法是被隐式声明为static方法。
7.用继承表达行为间的差异,用字段表达状态上的变化。
在写代码的时候决定将对象放到栈里或是静态的存储区域,将存储空间的分配和释放优先考虑。(C++,速度快)必须通过编程方式来确定何时销毁对象,可能导致内存泄漏。
在一个被称为堆的内存池里动态地创建对象。存储空间是运行时被动态管理的。(Java,灵活性高)垃圾回收,自动发现不再被使用的对象并销毁。
单根继承体系结构Java所有对象都具有一个共同接口,保证所有对象都具有某些功能,它们是相同的基本类型Object。使垃圾回收容易,将必须支持的功能置于基类中。
容器很容易复用,能存储Object的容器能存储任何东西。
Java程序的执行速度会有前后不一致的情况(垃圾收集器),不能用于实时系统。