Logo

郎哥编程

接口

2019-12-20 246

当子类继承抽象类时,需要实现抽象类的所有抽象方法。这样会存在一个问题,如果有些子类并不需要实现抽象类的所有抽象方法时,就会造成代码冗余。另外抽象类为了满足实际问题的需要,会把更多的事物行为纳入到抽象类中作为抽象方法,反过来更加重了代码的冗余。

要解决代码冗余的问题,就需要用到Java语言提供的接口,接口是抽象类的延伸,接口中的所有方法都没有方法体,任何类都可以实现接口内的方法,一个类可以实现多个接口。可以把抽象类的抽象方法通过接口来声明,需要实现抽象方法的子类实现接口就可以了。这样就解决了代码冗余的问题。

接口不仅仅用于软件产品,也广泛应用于硬件产品。

例如,计算机上提供的USB接口,专门供USB设备使用,如U盘、USB风扇、USB鼠标、USB键盘等。计算机通过统一的USB接口来提高通用性,使计算机不再需要同时具备U盘专用接口、鼠标专用接口、键盘专用接口等。

再如,计算机的主板上提供的PCI插槽,也提供统一的设计规范,使得遵守这个规范的声卡、显卡、网卡都可以插在PCI插槽上,如下图所示:

image.png


 PCI插槽提供的接口

上图中网卡、声卡、显卡内部结构都不相同,但可以把网卡、声卡、显卡都插在PCI插槽上,而不用担心哪个插槽是专门插那个卡的。

从上面两个例子可以看出,接口是一套标准规范,满足标准规范的外部设备都可以通过接口接入到系统。计算机设计师在设计USB接口时,规范USB的接入装置、供电电压、传输速率等。这些规范仅是规定了必须满足的功能和要求,但是却没有规定如何进行实现。

接口的具体实现由不同的USB设备厂商实现。这些USB设备厂商按照USB接口规范来生成产品,如U盘、USB鼠标等。

Java接口定义与实现

在Java中,使用interface关键字来定义接口。接口中的方法都只有声明,没有方法主体。例如:

//定义了一个PCI接口
public interface PCI {
//定义了一个开始方法
public void start();
//定义了一个结束的方法
public void stop();
}

Java接口中定义的方法都只有方法声明,没有方法体,也可以理解为接口中只能有抽象方法,具体的接口实现由实现类完成,这样就可以让不同的类遵守相同的规范,但又有自己的实现。

案例1:定义接口PCI,再分别定义声卡和显卡,来实现接口PCI规定的功能。

在PCoreUnit2项目新建pci包,在pci包下新建PCI接口。建立接口步骤如下:

(1)用鼠标选择src目录下的pci包,单击鼠标右键,在弹出的菜单项列表中选择【New】菜单项;

(2)在弹出的【New】子菜单项列表,选择【Interface】菜单项;

(3)在弹出的对话框中(如下图所示)Name输入域输入接口名称“PCI”,单击【Finish】按钮即可。

image.png


 PCI接口代码如下:

package pci;
 
/** 
* @ClassName: PCI 
* @Description: 抽象类与接口(接口)案例1  
* @author 编程训练营 
* @date 
* 
*/
 
public interface PCI {
  //定义了一个开始方法
  public void start();
  //定义了一个结束的方法
  public void stop();
}

PCI接口定义了两个方法,分别是start()方法和stop()方法,这两个方法只有方法声明,没有方法体。方法的实现由接口的实现类负责。

在pci包下新建SoundCard类(声卡类),该类实现PCI接口。步骤如下:

(1)用鼠标选择src目录下的pci包,单击鼠标右键,在弹出的菜单项列表中选择【New】菜单项;

(2)在弹出的【New】子菜单项列表,选择【Class】菜单项;

(3)在弹出的对话框(如下图所示)Name输入域输入类名称“SoundCard”,在Interfaces区域,单击【Add】按钮添加要实现的接口。最后单击【Finish】按钮即可。

image.png

 

SoundCard类代码如下:

package pci;
 
/** 
* @ClassName: SoundCard 
* @Description: 抽象类与接口(接口)案例1  
* @author 编程训练营 
* @date 
* 
*/
 
public class SoundCard implements PCI {
 
    /**
    * <p>Title: start</p> 
    * <p>Description: </p>   
    * @see pci.PCI#start() 
    */
 
    @Override
    public void start() {
       // TODO Auto-generated method stub
       System.out.println("Du du...");
    }
 
    /**
    * <p>Title: stop</p> 
    * <p>Description: </p>   
    * @see pci.PCI#stop() 
    */
 
    @Override
    public void stop() {
       // TODO Auto-generated method stub
       System.out.println("Sound Stop!");
    }
 
}

类实现接口需要使用“implements”关键字,在“implements”关键字后面空格后紧跟接口名称。SoundCard类重写了PCI接口的两个方法。

在pci包下新建NetworkCard类(网卡类),该类实现PCI接口。NetworkCard类代码如下:

package pci;
 
/** 
* @ClassName: NetworkCard 
* @Description: 抽象类与接口(接口)案例1  
* @author 编程训练营 
* @date 
* 
*/
 
public class NetworkCard implements PCI {
 
    /**
    * <p>Title: start</p> 
    * <p>Description: </p>   
    * @see pci.PCI#start() 
    */
 
    @Override
    public void start() {
       // TODO Auto-generated method stub
       System.out.println("Send...");
    }
 
    /**
    * <p>Title: stop</p> 
    * <p>Description: </p>   
    * @see pci.PCI#stop() 
    */
 
    @Override
    public void stop() {
       // TODO Auto-generated method stub
       System.out.println("Network stop!");
    }
 
}

NetworkCard类通过implements关键字来声明实现PCI接口,并分别实现了接口的start方法和stop方法。

在pci包下新建测试类InterfaceTest类,测试SoundCard类和NetworkCard类。InterfaceTest类代码如下:

package pci;
 
/** 
* @ClassName: InterfaceTest 
* @Description:抽象类与接口(接口)案例1
* @author 编程训练营 
* @date  
* 
*/
 
public class InterfaceTest {
 
    /** 
    * @Title: main 
    * @Description:Java程序入口main方法 
    * @param @param args    参数 
   
    * @return void    返回类型 
    * @throws 
    */
 
    public static void main(String[] args) {
       // 实例化SoundCard对象
       SoundCard  soundCard = new  SoundCard();
       // 调用接口方法
       soundCard.start();
       soundCard.stop();
 
       // 实例化NetworkCard对象
       NetworkCard  netCard = new  NetworkCard();
       // 调用接口方法
       netCard.start();
       netCard.stop();
 
    }
 
}

程序执行结果如下图所示:

image.png

 

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论