一、接口的定义
接口的定义和类的定义很类似,分为接口生命和和接口体。
1、接口声明
和类不同的是,接口使用interface来声明自己是一个接口,格式如:
interface 接口的名字
2、接口体
接口体包含常量的声明(没有变量)和抽象方法两部分,接口体中只有抽象方法,没有普通的方法,而且接口体中所有的常量的访问权限一定都是public,而且是static,所有的抽象方法的访问权限一定都是public。
二、实现接口
1、类实现接口
接口由类来实现以便使用接口中的方法。用implements声明该类实现一个或多个接口。多个接口用逗号隔开。如A类实现Printable和Addable接口。
class A implements Printable,Addable
2、重写接口中的方法
如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法,方法的权限必须为pubic来修饰。实现接口的非抽象类实现了该接口的方法,即给出了方法的具体行为功能。
抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法。
3、接口的继承
接口也可以被继承,即可以通过关键字extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是public的,子接口将继承父接口中的全部方法和常量。
三、abstract类与接口的比较
接口和abstract类的比较如下:
* abstract类和接口都可以有abstract方法。
* 接口中只可以有常量,不能有变量;而abstract类中既可以有常量也可以有变量。
* abstract类中也可以有非abstract方法,接口不可以。
在设计程序时应当根据具体的分析来确定是使用抽象类还是接口,abstract类除了提供重要的需要子类重写的abstract方法外,也提供了子类可以继承的变量和非abstract方法。如果某个问题需要使用继承才能更好的解决,比如,子类除了需要重写父类的abstract方法,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑用abstract类。如果某个问题不需要继承,只要需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。
四、例题
实现一个防盗门的功能,将开门,关门等功能放在抽象类中,将开锁上锁放在接口中,由防盗门类来实现,并添加一个拍照的功能放入接口
Door.java
1 public abstract class Door { 2 abstract void openDoor(); 3 abstract void closeDoor(); 4 }
Lock.java
public interface Lock { void onLock(); void unLock(); }
Ling.java
public interface Ling { void takePicture(); }
TheftproofDoor.java
public class TheftproofDoor extends Door implements Lock,Ling{ @Override void closeDoor() { // TODO Auto-generated method stub System.out.println("轻轻拉门,门关上了。"); } @Override public void onLock() { // TODO Auto-generated method stub System.out.println("插进钥匙,向左旋转钥匙三圈,锁上了,拔出钥匙。"); } @Override public void takePicture() { // TODO Auto-generated method stub System.out.println("铃......咔嚓......照片已储存"); } @Override public void unLock() { System.out.println("插进钥匙,向左旋转钥匙三圈,锁打开了,拔出钥匙。"); } @Override void openDoor() { // TODO Auto-generated method stub System.out.println("用力推,门打开了。"); } }
Test03.java
public class Test03 { public static void main(String[] args) { TheftproofDoor door=new TheftproofDoor(); door.closeDoor(); door.onLock(); door.takePicture(); door.unLock(); door.closeDoor(); } }