1.抽象类
学习接口之前我们回顾一下抽象类。
在JAVA中用关键字abstract来修饰一个类时,这个类叫做抽象类,用abstract关键字来修饰一个方法时,这个方法叫做抽象方法。
abstract class abstractclass{...}//抽象类
abstract returnType abstractMethod([paramlist])//抽象方法
抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现。抽象类不能被实例化,抽象类不一定包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类。
2.接口与多重继承
接口是抽象类的一种,中包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。
接口的作用:
主要是帮助实现相当于类的多重继承的功能。
多重继承:
指一个子类可以有一个以上的直接父类,该子类可以继承它所有的直接父类的属性。
3.接口的定义
接口是有常量和抽象方法组成的特殊类,接口的定义包括接口声明和接口体。接口声明格式格式如下:
[可见度] interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
实例:
/* 文件名 : NameOfInterface.java */
import java.lang.*;
//引入包
public interface NameOfInterface
{
//任何类型 final, static 字段
//抽象方法
}
接口有以下特性:
接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
接口中的方法都是公有的。
例:
interface Animal {
public void eat();
public void travel();
}
4.接口的实现
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
实现一个接口的语法,可以使用这个公式:
...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...
实例:
public class MammalInt implements Animal{
public void eat(){
System.out.println("Mammal eats");
}
public void travel(){
System.out.println("Mammal travels");
}
public int noOfLegs(){
return 0;
}
public static void main(String args[]){
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
运行结果:
Mammal eats
Mammal travels
接口的完整实例:
//接口的声明
public interface PCI {
void start();
void stop();
}
//接口的实现,相当于网卡上的PCI插槽
public class NetworkCard implements PCI {
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("Send...");
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("Network stop!");
}
}
//接口的实现,相当于声卡上的PCI插槽
public class SoundCard implements PCI {
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("Du du...");
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("Sound stop!");
}
}
//接口的实现,相当于主板上的PCI插槽
public class MainBoard {
public void userPCICard(PCI p) {
p.start();
p.stop();
}
}
//主板调用接口的运行方法,也就是调用PCI插槽
public class Assember {
public static void main(String[] args) {
// TODO Auto-generated method stub
MainBoard mb=new MainBoard();
NetworkCard nc=new NetworkCard();
mb.userPCICard(nc);
SoundCard sc=new SoundCard();
mb.userPCICard(sc);
}
}
运行结果:
Send...
Network stop!
Du du...
Sound stop!
接口的继承:
一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。
下面的Sports接口被Hockey和Football接口继承实例:
// 文件名: Sports.java
public interface Sports
{
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
// 文件名: Football.java
public interface Football extends Sports
{
public void homeTeamScored(int points);
public void visitingTeamScored(int points);
public void endOfQuarter(int quarter);
}
// 文件名: Hockey.java
public interface Hockey extends Sports
{
public void homeGoalScored();
public void visitingGoalScored();
public void endOfPeriod(int period);
public void overtimePeriod(int ot);
}
Hockey接口自己声明了四个方法,从Sports接口继承了两个方法,这样,实现Hockey接口的类需要实现六个方法。
相似的,实现Football接口的类需要实现五个方法,其中两个来自于Sports接口。
接口的多继承
在Java中,类的多继承是不合法,但接口允许多继承。
在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:
public interface Hockey extends Sports, Event
以上的程序片段是合法定义的子接口,与类不同的是,接口允许多继承,而 Sports及 Event 可能定义或是继承相同的方法