现在学完了JAVA的面向对象,有点晕,最主要就是接口,它没方法实现那有什么作用呢?
------解决方案--------------------
为什么使用接口
两个类中的两个类似的功能,调用他们的类动态的决定一种实现,那他们提供一个抽象父类,子类分别实现父类所定义的方法。
问题的出现:Java是一种单继承的语言,一般情况下,哪个具体类可能已经有了一个超类,解决是给它的父类加父类,或者给它父类的父类加父类,只到移动到类等级结构的最顶端。这样一来,对一个具体类的可插入性的设计,就变成了对整个等级结构中所有类的修改。
接口是可插入性的保证。
在一个等级结构中的任何一个类都可以实现一个接口,这个接口会影响到此类的所有子类,但不会影响到此类的任何超类。此类将不得不实现这个接口所规定的方法,而其子类可以从此类自动继承这些方法,当然也可以选择置换掉所有的这些方法,或者其中的某一些方法,这时候,这些子类具有了可插入性(并且可以用这个接口类型装载,传递实现了他的所有子类)。
我们关心的不是那一个具体的类,而是这个类是否实现了我们需要的接口。
接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,生命周期越长,接口使得软件系统的灵活性和可扩展性,可插入性方面得到保证。
类型
使用Java接口将软件单位与内部和外部耦合起来。使用Java接口不是具体的类进行变量的类型声明,方法的返还类型声明,参量的类型声明,以及数据类型的转换。
在理想的情况下,一个具体的Java类应当只实现Java接口和抽象Java类中声明的方法,而不应当给多余方法。
类型等级结构
Java接口(以及抽象类)一般用来作为一个类型的等级结构的起点。
如果一个类已经有了一个主要的超类型,那么通过实现一个接口,这个类可以拥有另一个次要的超类型,这种次要的超类型叫做混合类型。
[编辑本段]Java接口常用方法
单方法接口
以下是引用片段:
public interface Actionlistener{
public abstract void actionPerformed(ActionEvent event);
}
仅且只有一个方法,只有实现了这个接口(重写这个接口中的唯一一个方法),你才有资格去事件监听器列表里注册(参数为Actionlistener类型),当事件源变动时,自动调用这个唯一的actionPerformed方法.
标识接口
是没有任何方法和属性的接口。标识接口不对实现它的类有任何语意上的要求,它仅仅表明了实现它的类属于一个特定的类型(传递)。
不推荐过多的使用标识接口。
常量接口
用Java接口来声明一些常量,然后由实现这个接口的类使用这些常量(以前在做画板的时候这么干过)。建议不要模仿这种常量接口的做法。
1, Java语言不支持一个类有多个直接的父类(多继承),但可以实现(implements)多个接口,间接的实现了多继承.
2, 与Java接口相关的设计模式:
1, 定制服务模式
设计精粒度的接口,每个Java接口代表相关的一组服务,通过继承来创建复合接口
2, 适配器模式
当每个系统之间接口不匹配时,用适配器来转换接口
3, 默认适配器模式
为接口提供简单的默认实现
4, 代理模式
为Java接口的实现类创建代理类,使用者通过代理来获得实现类的服务
5, 标识类型模式
用接口来标识一种没有任何行为的抽象类型
6, 常量接口模式
在接口中定义静态常量,在其它类中通过import static语句引入这些常
比较抽象类与接口
1, 抽象类与接口都位于继承树的上层
相同点
1, 代表系统的抽象层,当一个系统使用一颗继承树上的类时,应该尽量把引用变量声明为继承树的上层抽象类型,这样可以提高两个系统之间的送耦合
2, 都不能被实例化
3, 都包含抽象方法,这些抽象方法用于描述系统能提供哪些服务,但不提供具体的实现
不同点:
1, 在抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,这是抽象类的优势,但这一优势限制了多继承,而接口中只能包含抽象方法.由于在抽象类中允许加入具体方法,因此扩展抽象类的功能,即向抽象类中添加具体方法,不会对它的子类造成影响,而对于接口,一旦接口被公布,就必须非常稳定,因为随意在接口中添加抽象方法,会影响到所有的实现类,这些实现类要么实现新增的抽象方法,要么声明为抽象类
2, 一个类只能继承一个直接的父类,这个父类可能是抽象类,但一个类可以实现多个接口,这是接口的优势,但这一优势是以不允许为任何方法提供实现作为代价的三, 为什么Java语言不允许多重继承呢?当子类覆盖父类的实例方法或隐藏父类的成员变量及静态方法时,Java虚拟机采用不同的绑定规则,假如还允许一个类有多个直接的父类,那么会使绑定规则更加复杂,
------解决方案--------------------
简单点:
定义个接口,不妨叫做流行明星PopStar.现在要举办**汇演,请这些明星来参加,明星们最拿手的就是唱歌了。
这样PopStar就有一个叫做singSong的方法,唱歌
interface PopStar{
void singSong(String songName);
}
假如你就是这些明星的老大,或者经纪公司.你向举办方提供一批明星的名单:
List<PopStar>singerList;
这些明星一个个都去实现PopStar这个接口,也就是实现唱歌这个抽象方法.
好了,到了汇演现场,你手下的这些明星依次上场表演:
PosStar currentStar = null;
currentStar = ("曾哥")singerList.iterator.next();
currentStar.singSong("...");
currentStar = ("春哥")singerList.iterator.next();
currentStar.singSong("...");
(本人对超女不熟悉,具体唱什么也不知道,用省略号代替吧,意思到了即可)
.....
一个个明星自己唱歌.
OK,举办方不用关心你这个明星怎么唱歌的,只要我知道你是明星而且来了就会给我唱歌。我只管调用你的singSong就可以了.
回到java接口编程:你是程序员,就是上面的经纪公司,举办方就是你的程序使用者.明星名单就是接口,明星就是你一个个具体的业务方法。
你把程序设计好了,只需把接口提供给程序使用者,暴露必要的方法.调用方不必关心你具体怎么实现的.