一、基本概念
接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。如果一个类只由抽象方法和全局常量组成,那么这种情况下不会将其定义为一个抽象类。只会定义为一个接口,所以接口严格的来讲属于一个特殊的类,而这个类里面只有抽象方法和全局常量,就连构造方法也没有。
实例:
interface Iwalk {
//此时的应为public static String name;
//此时的他为全局变量
String NAME = "小白";
/*
* 在接口中没有方法体,不能创建对象
* 更没有构造方法
*/
void dowork();
//它的原型其实是public static abstract void dowork();
}
二、接口的使用
1、由于接口里面存在抽象方法,所以接口对象不能直接使用关键字new进行实例化。接口的使用原则如下:
(1)接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口; (2)接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法;
(3)接口的对象可以利用子类对象的向上转型进行实例化。
代码:
interface Iwalk {
void dowalk(); }
interface Iswim {
void DoSwim();
}
public class DoubleWork implements Iwalk,Iswim{
//类实现与接口的对接必须用实现关系
//并且必须覆盖
public void dowalk() {
System.out.println("我会走");
}
public void DoSwim() {
System.out.println("我会游");
}
}
public class Test {
public static void main(String[] args) {
DoubleWork x = new DoubleWork();
x.DoSwim();
x.dowalk();
}
}
代码答案:我会游 我会走
2、对于子类而言,除了实现接口外,还可以继承抽象类。若既要继承抽象类,同时还要实现接口的话,使用一下语法格式:
class 子类 [extends 父类] [implemetns 接口1,接口2,...] {}
public interface A {
/*
* 此时的doA的访问权限应该时publicabstract...
*/
void doA();
}
public interface B {
void doB();
}
public abstract class C {
public void doC();
}
public class D extends C implements A,B {
/*
* 因为接口类中的权限是公共的。所以在继承她的方法时
* 必须也使用公共的
*/
public void doA() {
System.out.println("我是接口A");
}
public void doB() {
System.out.println("我是接口B");
}
public void doC() {
System.out.println("我是抽象类C");
}
}
public class TestTwo {
public static void main(String[] args) {
D d = new D();
d.doA();
d.doB();
d.doC();
}
}
代码:我是接口 我是接口B 我是抽象类C
3、在Java中,一个抽象类只能继承一个抽象类,但一个接口却可以使用extends关键字同时继承多个接口(但接口不能继承抽象类)。
interface A{
public void funA();
}
interface B{
public void funB();
}
//C接口同时继承了A和B两个接口
interface C extends A,B{//使用的是extends
public void funC();
}
class X implements C{
@Override
public void funA() {
}
@Override
public void funB() {
}
@Override
public void funC() {
}
}
由此可见,从继承关系来说接口的限制比抽象类少:
(1)一个抽象类只能继承一个抽象父类,而接口可以继承多个接口;
(2)一个子类只能继承一个抽象类,却可以实现多个接口(在Java中,接口的主要功能是解决单继承局限问题)
4:从接口的概念上来讲,接口只能由抽象方法和全局常量组成,但是内部结构是不受概念限制的,正如抽象类中可以定义抽象内部类一样,在接口中也可以定义普通内部类、抽象内部类和内部接口(但从实际的开发来讲,用户自己去定义内部抽象类或内部接口的时候是比较少见的),
public interface A {
public void funA();
abstract class B{//定义一个抽象内部类
public abstract void funB();
}
}
三、接口的实际应用(标准定义)
在日常的生活之中,接口这一名词经常听到的,例如:USB接口、打印接口、充电接口等等。
如果要进行开发,要先开发出USB接口标准,然后设备厂商才可以设计出USB设备。
现在假设每一个USB设备只有两个功能:安装驱动程序、工作。
定义一个USB的标准:
public interface USB {
/*
* 定义类的接口使其它的类规范
*/
void install();
void doWork();
}
public class Iphone implements USB{
public void install() {
System.out.println("手机驱动正在安装.......");
}
public void doWork() {
System.out.println("手机已经成功安装。");
}
}
public class Print implements USB {
public void install() {
System.out.println("打印机驱动正在安装.......");
}
public void doWork() {
System.out.println("打印机已经成功安装。");
}
}
public class Computer {
public void plugin(USB usb) {
usb.install();
usb.doWork();
}
}
public class TestD {
public static void main(String[] args) {
Computer cpt = new Computer();
cpt.plugin(new Iphone());
cpt.plugin(new Print());
}
}
答案:、
手机驱动正在安装.......
手机已经成功安装。
打印机驱动正在安装....... 打印机已经成功安装。