Java基础 - 接口

Java接口

 

这片文章用来搜集资料来解决 1什么是接口 2 接口能用来干吗 这两个问题的.

 

接口是什么?(下面对接口的描述每个观察的角度所呈现的都略有不同,不过隐藏在这些话背后的本质的东西就是这个问题的答案)

 

Java中,接口不是类,而是一组对类的要求,这些类要与接口一致。<<Java2核心技术第I>>

 

当一个类实现了一个接口的时候,这个接口被用做一个类型(type),通过此类型可以引用这个类的实例,因此,一个类实现一个接口,就表明客户可以对这个类的实例实施某些动作.为了任何其他目的而定义接口是不合适的.<<Effective Java>>

 

常量接口模式是对接口的不良使用. <<Effective Java>>

 

总之,接口应该只是被用来定义类型的,它们不应该用来导出常量. <<Effective Java>>

(PS:Joshua Blochsun标准库设计和维护的经验,所以他对于接口的认识是从库结构设计的角度观察的.他觉得常量接口模式会弄脏实现该接口的类可能是出于他是一个类库的实现者,事实上,我觉得常量接口模式还是很有用和方便的.)

 

接口(interface)和内部类(inner class)为我们提供了一种用来组织和控制系统中的对象的更加精致的方法. <<Thinking in Java 3rd >>(PS:我更倾向于用这种角度看接口)

 

虽然这些特性本身是相当直观的,(PS:这里的特性指的是接口和内部类)但是就像多态机制一样.这些特性的使用应该是设计阶段考虑的问题.(PS:接口应该在程序设计的时候就好好考虑了)<<Thinking in Java 3rd >>

 

接口是为支持运行时态方法解决设计的.通常,为使一个方法可以在类间调用,两个类都必须出现在编译时间里,以便Java编译器可以检查以确保方法特殊是兼容的.这个需求导致了一个静态的不可扩展的类环境.在一个系统中不可避免的会出现这类情况,函数在类层次中越堆越高以致该机制可以为越来越多的子类可用.接口的设计避免了这个问题.他们把方法或方法系列的定义从类层次中分开.因为接口是在和类不同的层次中,与类层次无关的类实现相同的接口是可行的,这是实现接口的真正原因所在. (PS:这也是众多参考书中建议使用接口而不推荐使用继承的原因之一) <<Java2参考大全>>

 

 I see interfaces as a fundamental tool for achieving flexibility in the design of Java-based systems. Any class can provide an implementation of an interface. As long as you don't change the interface itself, you can make all kind of changes to the implementing classes, or plug in new classes, without impacting code that depends only on the interface. Thus, if you have a subsystem that represents an abstraction that may have multiple implementations, whether the subsystem is a single object, a group of objects, an entire Java applet or application, you should define Java interfaces through which the rest of the world communicates with that subsystem. When you use interfaces in this way, you decouple the parts of your system from each other and generate code that is more flexible: more easily changed, extended, and customized. article:<<Designing with interfaces>>(PS:对接口的一个较完善的总结,写的很不错。)

 

 

 

 

 

接口能干什么?

 

有些接口只定义了常量,而没有定义方法。例如,标准库中有一个SwingConstants接口,它定义了NORTH,SOUTH,HORIZONTAL等常量。任何实现了SwingConstants接口的类都自动继承了这些常量。这些类中的方法可以直接访问NORTH,而不必使用SwingConstants.NORTH.(<<Java2核心技术第I>>P202)

 

Java's interface gives you more polymorphism than you can get with singly inherited families of classes, without the "burden" of multiple inheritance of implementation. article:<<Designing with interfaces>>

 

Some say you should define all classes in terms of interfaces, but I think recommendation seems a bit extreme. I use interfaces when I see that something in my design will change frequently. article:<<Designing with interfaces>>

 

In designing a Java-based System,you should use Java interfaces to represent abstract interfaces – the ways in which the parts will interfact with each other. article:<<Designing with interfaces>>

 

 

 

其他关于接口的参考:

Designing with interfaces

Author:

Bill Venners

URL:

http://www.javaworld.com/javaworld/jw-12-1998/jw-12-techniques.html?

Summary:

In this installment of my Design Techniques column, I describe my process to understanding Java's interface. I talk about multiple inheritance and the diamond problem, polymorphism and dynamic binding, separation of interface and implementation as the spirit of Java, and my ultimate epiphany on how we should think about and use interfaces when we design. (3,500 words)

 

 

 Abstract classes vs. interfaces

Author:

Tony Sintes

URL:

http://www.javaworld.com/javaworld/javaqa/2001-04/03-qa-0420-abstract.html?

Summary:

When does it make sense to choose an abstract class over an interface?

 

 

Java使用接口来实现同样功能的回调函数

摘要:
Java
接口提供了一个很好的方法来实现回调函数。如果你习惯于在事件驱动的编程模型中,通过传递函数指针来调用方法达到目的的话,那么你就会喜欢这个技巧。
作者:John D. Mitchell

MS-Windows或者X-Window系统的事件驱动模型中,当某些事件发生的时候,开发人员已经熟悉通过传递函数指针来调用处理方法。而在Java的面向对象的模型中,不能支持这种方法,因而看起来好像排除了使用这种比较舒服的机制,但事实并非如此。


Java
的接口提供了一种很好的机制来让我们达到和回调相同的效果。这个诀窍就在于定一个简单的接口,在接口之中定义一个我们希望调用的方法。
举个例子来说,假设当一个事件发生的时候,我们想它被通知,那么我们定义一个接口:

public interface InterestingEvent
{
// This is just a regular method so it can return something or
// take arguments if you like.
public void interestingEvent ();
}


这就给我们一个控制实现了该接口的所有类的对象的控制点。因此,我们不需要关心任何和自己相关的其它外界的类型信息。这种方法比C函数更好,因为在C++风格的代码中,需要指定一个数据域来保存对象指针,而Java中这种实现并不需要。
发出事件的类需要对象实现InterestingEvent接口,然后调用接口中的interestingEvent ()方法。

public class EventNotifier
{
private InterestingEvent ie;
private boolean somethingHappened;
public EventNotifier (InterestingEvent event)
{
// Save the event object for later use.
ie = event;
// Nothing to report yet.
somethingHappened = false;
}
//...
public void doWork ()
{
// Check the predicate, which is set elsewhere.
if (somethingHappened)
{
// Signal the even by invoking the interface's method.
ie.interestingEvent ();
}
//...
}
// ...
}


在这个例子中,我们使用了somethingHappened这个标志来跟踪是否事件应该被激发。在许多事例中,被调用的方法能够激发interestingEvent()方法才是正确的。
希望收到事件通知的代码必须实现InterestingEvent接口,并且正确的传递自身的引用到事件通知器。

public class CallMe implements InterestingEvent
{
private EventNotifier en;
public CallMe ()
{
// Create the event notifier and pass ourself to it.
en = new EventNotifier (this);
}
// Define the actual handler for the event.
public void interestingEvent ()
{
// Wow! Something really interesting must have occurred!
// Do something...
}
//...
}


希望这点小技巧能给你带来方便。
关于作者:
John D. Mitchell
在过去的九年内一直做顾问,曾经在Geoworks使用OO汇编语言开发了PDA软件,兴趣于写编译器,Tcl/TkJava系统。和人合著了《Making Sense of Java》,目前从事Java编译器的工作。

 

 

 

窗体顶端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值