接口就是方法的定义,而去实现它
接口其实也算是抽象类的一种特殊形式,在java中不是多继承的,但是导入多个接口,所以接口比抽象类使用更灵活,
不过接口和抽象的本质是一样的,都是OOP多态的体现,有了抽象(接口也是抽象),我们可以更高效的编写程序,可以写出复用性更高的程序,所以才有了这么多的设计模式!建议你多看看是,多用一用,多写写。在这里问接口是什么,你永远也不能真真明白,因为太多东西了,太复杂了,不是几句话说的清楚了,关键是自己好好的去思考,去领悟,去体会,
接口其实也算是抽象类的一种特殊形式,在java中不是多继承的,但是导入多个接口,所以接口比抽象类使用更灵活,
不过接口和抽象的本质是一样的,都是OOP多态的体现,有了抽象(接口也是抽象),我们可以更高效的编写程序,可以写出复用性更高的程序,所以才有了这么多的设计模式!建议你多看看是,多用一用,多写写。在这里问接口是什么,你永远也不能真真明白,因为太多东西了,太复杂了,不是几句话说的清楚了,关键是自己好好的去思考,去领悟,去体会,
解决方案 »
- 请问jfreechart的X时间轴可以出现2条吗?
- 一个关于时间和多线程的代码请高手指正一下
- JTAPI编写来电显示问题~~~~~~~~~~~~~
- java.io.File类的问题
- applet的问题。
- 想用java做一个浏览器用ie的核,不知道怎么能实现?
- 求数据结构(JAVA语言版)电子书
- 小问题!急
- 哪儿错了???为什么抛出了NullPointerException???
- 各位老大:使用JTextField组件添加DocumentListener监听内容改变时,如何动态的获得它当前的录入值?
- 一个多维数组问题 比如 int[][] a =
- 菜鸟提问:MenuBar,ToolBar,TextArea这三个该怎么布局??
java不支持多继承性,即一个类只能有一个父类.单继承性使得java简单,易于管理程序.为了克服单继承性得缺点,java使用了接口,一个类可以实现多个接口.
实际上就是C++中的虚基类。java中可以同时实现多个接口。但接口中的方法只能定义,不能实现,具体在子类中去实现
最好能够指明哪个是类提供者,哪个是类使用者,希望有程序代码和注释!
我想这样会使你抽象的语言实例化,让大家更深刻的理解一下!
谢谢!
看看java核心包的容器(Collection、HashMap、HashSet)代码,是Josh Bloch写的。
jdk里有
你也可以到这个网址中看:
http://javaresearch.gro.clinux.org/jdk140/:)
IDBConn接口方法:
RecordSet executeSQL(String sql)
void commit()
void rollback()好了,现在可以编码实现它。如sean_gao(大胃)所说,接口是设计协议的概念,而不只是指JAVA语言中的interface,我们分别用abstract class和interface两种方法实现它.//1.用interface实现接口
import java.sql.*;interface IDBConn{
ResultSet executeSQL(String sql);
void commit();
void rollback();
}class DBConn implements IDBConn{
public ResultSet executeSQL(String sql){
System.out.println("call DBConn.executeSQL: " + sql);
return null;
}
public void commit(){
System.out.println("call DBConn.commit");
}
public void rollback(){
System.out.println("call DBConn.rollback");
}
}public class test2 { public static void main(String[] args) {
IDBConn conn = new DBConn();
conn.executeSQL("SELECT * FROM TEST");
conn.commit();
conn.rollback();
}
}//2.用abstract class实现接口
import java.sql.*;abstract class IDBConn{
abstract ResultSet executeSQL(String sql);
abstract void commit();
abstract void rollback();
}class DBConn
{
IDBConn dbConn = new IDBConn(){
ResultSet executeSQL(String sql){
System.out.println("call DBConn.executeSQL: " + sql);
return null;
}
void commit(){
System.out.println("call DBConn.commit");
}
void rollback(){
System.out.println("call DBConn.rollback");
}
}; IDBConn getIDBConn(){
return dbConn;
} ResultSet executeSQL(String sql){
return dbConn.executeSQL(sql);
}
void commit(){
dbConn.commit();
}
void rollback(){
dbConn.rollback();
}}public class test2 { public static void main(String[] args) {
IDBConn conn = new DBConn().getIDBConn();
conn.executeSQL("SELECT * FROM TEST");
conn.commit();
conn.rollback();
}
}
接口和抽象类
在去年的12 月初, 我在Design Patterns Explained 的讨论组上看到这个系列帖子,
觉得很有意思, 所以整理出来。如果你喜欢这种形式, 请写信到[email protected], 我会整理
更多有趣的帖子出来。
面向对象中有一个术语: 派生。在用Java 编程的时候, 派生的来源可以是抽象类
( abstract class)、也可以是接口( interface)。何时使用抽象类? 何时使用接口? 这几
个帖子正是讨论了这个问题。
( 提出问题)
Alan, 我买了你的书, 读到了其中“ Bridge 模式” 那一章。然后, 我把一位朋友— —
他是个Java专家, 有五、六年使用Java的经验— — 叫来, 把你的书给他看, 并请他为我解
释你的Java 代码。我自己比较偏向于使用接口, 而你更多的使用了抽象类。他得出的结论
是: 你偏向于使用抽象类, 这反映出你对C++的爱好多于对Java的爱好。毕竟Java才有接
口这个概念, 而C++只有抽象类。因此, 我们感觉: 如果把你的示例代码中的抽象类换成接
口, 也许会使它们更能反映出实际情况和“ 按照协议设计” 的思想。实际上, 如果读过Peter
Coad的书, 你会发现他也主要使用接口。
( Alan Shalloway 的答复)
感谢你对这本书的评论。
我用Java 也有五、六年了, 所以我不认为使用抽象类就表示没有经验。实际上, 我觉
得Java 的一大缺憾就是它不支持多继承, 所以开发者经常被迫使用接口, 因为继承只能使
用一次。当然了, 这里面涉及到多继承的性能问题和基类成员的名字重复问题。但是不管怎
么说, 不允许多继承总是值得质疑的。
至于我这本书, 我选择使用抽象类, 是因为大多数人都熟悉它— — 不是每个人都喜欢去
看章节后面的C++示例的, 所以我决定用这种更通用的示例。
接口的问题就是它无法拥有默认行为。如果你用接口来定义一个什么东西并希望跨过这
层封装来添加一些行为, 你就必须使用委托。在我的记忆中, 有很多次就是因为不支持默认
行为而造成了麻烦。为了绕过这个限制, 我会使用委托, 但是这也是个痛苦的事情。
BTW: 我很喜欢Coad的书— — 我认为那是有史以来最好的设计书籍之一。
( Scott Bain 的跟贴)
从我自己的角度来说, 我是一个Java程序员( 从来没用过C++)。但是每当我遇到单继
承关系的时候, 我倾向于使用抽象类, 尽管我知道Java 不支持多继承。为什么这样? 因为
即使我现在没有任何默认行为, 将来我还可以放进一些默认行为, 而不必修改子类的结构。
而且, 如果要在一个继承体系中放置工厂方法来生成子类的实例, 抽象类是就是最好、
最合乎逻辑的地方。因为客户对象只需要“ 知道” 抽象类就可以了, 通过转型得到的实例完
全封装了子类的存在和选择子类的规则。这使得系统的扩展变得简单,而且不会造成副作用。
只有当需要让一个类“ 象什么” 而非“ 是什么” 的时候, 我才会使用接口。
( Alan Shalloway 的回复)
PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
精彩! 很高兴看到这样的回复! J
我也发现, 在Java 中缺少默认行为造成的影响似乎还没有真正引起人们的重视。从一
开始, SUN 似乎就忽略了向后兼容的问题。我可以大胆的预言: 完全用接口构建成的系统将
在几年之后发现这是一个大问题。据我所知, 有几个基于COM 模型( 也就是接口) 构建的应
用程序的开发者现在已经陷入了维护问题, 因为当他们想修改接口来应对新的情况( 比如添
加新的参数或新的方法) 时, 这会耗去他们大量的时间。如果使用抽象类, 修改就不会这么
困难, 因为你可以只修改默认方法, 子类就不用动了。
我可不是说不能使用接口, 但是你必须清楚: 有些时候应该使用接口, 而有些时候就是
应该使用抽象类。不幸的是, 由于Java不支持多继承, 你必须很小心的做出选择。
( Scott Bain 的跟贴)
同样精彩! 关于接口, 我再来废话几句:
有时候, 一个东西可以“ 是” 几个东西。不明白这句话吗? 我就拿我自己来举个例子吧:
我“ 是”一个程序员、一个老师、一个作者、一个父亲… … 你可以说我“ 实现了老师的接口”,
学生们会向我询问关于上课的问题。我还“ 实现了父亲的接口”, 但是我的学生可能知道这
一点, 也可能不知道。如果他们知道这一点, 他们就可以放心的向我询问关于抚养小孩的问
题了。
但是, 尽管我实现了所有这些接口, 我还有一个抽象类— — “ 人”。这个抽象类给我提
供了所有的默认行为( 比如说我偶尔会走背运)。