一. 概述
1. 定义
初期理解:
可以认为是一个特殊的抽象类。当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表现。
class用于定义类
interface用于定义接口
2. 格式
(1)接口中常见定义:常量&抽象方法
(2)接口中的所有成员都有固定修饰符
常量:public static final
方法:public abstract
接口中的成员都是public的
3. 实例化
- 接口是不可以创建对象的,因为有抽象方法;
- 接口不适合被继承(extends),因为接口中所有的方法都是抽象的,不能直接被子类拿来用;
- 接口需要被实现(implements);
- 子类对接口中的抽象方法全都覆盖后,子类才可以实例化。否则子类是一个抽象类。
interface Inter
{
public static final int NUM=3;
public abstract void show();
}
class Test implements Inter //实现
{
public void show(){} //将抽象方法覆盖
}
class InterfaceDemo
{
public static void main(String[] args)
{
Test T=new Test();
System.out.println(T.NUM); //通过对象调用静态变量
System.out.println(Test.NUM); //通过子类直接调用静态变量
System.out.println(Inter.NUM); //通过接口直接调用静态变量
}
}
输出结果是:
3
3
3
4. 特性
- 接口可以被类多实现
接口可以被类(接口)多实现。
也是对多继承不支持的转换形式,Java支持多实现。 - 为什么接口可以被多实现
因为需要实现的接口中,方法都是抽象的,没有主体,子类可以任意定义
interface Inter
{
public static final int NUM=3;
public abstract void show(); //没有方法主体,可以由子类任意定义
}
interface InterA
{
public abstract void show(); //没有方法主体,可以由子类任意定义
}
class Test implements Inter,InterA //可以实现多个接口
{
public void show(){} //子类任意定义
}
二. 关系
1. 类与接口
类与接口之间是实现的关系,而且类可以继承一个类的同时实现多个接口
interface Inter
{
public static final int NUM=3;
public abstract void show(); //没有方法主体,可以由子类任意定义
}
interface InterA
{
public abstract void show(); //没有方法主体,可以由子类任意定义
}
class Demo
{
public void function(){}
}
class Test extends Demo implements Inter,InterA //可以继承类并实现多个接口
{
public void show(){} //子类任意定义
}
2. 接口与接口
(1)接口与接口之间可以有继承关系
interface A
{
public abstract void methodA();
}
interface B extends A
{
public abstract void methodB();
}
interface C extends B
{
public abstract void methodC();
}
class D implements C
{
public void methodsA(){}
public void methodsB(){}
public void methodsC(){}
}
(2)接口之间可以多继承
不仅可以被多实现,本身还可以多继承,因为没有方法主体
interface A
{
public abstract void methodA();
}
interface B
{
public abstract void methodB();
}
interface C extends B,A //接口可以多继承,因为没有方法体
{
public abstract void methodC();
}
class D implements C
{
public void methodsA(){}
public void methodsB(){}
public void methodsC(){}
}
接口可以多继承,但是
当相同抽象方法名的返回值类型不同时,会报错
因为对象在调用时,不知道是调用返回值为哪个的方法
//以下是个错误的例子
interface A
{
public abstract int show(); //返回值类型是int
}
interface B
{
public abstract boolean show(); //返回值类型是boolean
}
interface C extends B,A //接口可以多继承,因为没有方法体
{
public abstract void methodC();
}
class D implements C
{
public void methodsC(){}
public int show(){} //覆盖了返回值类型为int的抽象方法
public boolean show(){} //覆盖了返回值类型为boolean的抽象方法
}
三. 特点
- 接口是对外暴露的规则。
- 接口是程序的功能扩展。
- 接口可以用来多实现。
- 类与接口之间是实现的关系,而且类可以继承一个类的同时实现多个接口。
- 接口与接口之间可以有继承关系。
四. 举例(接口可用于功能扩展)
abstract class Student
{
abstract void study();
void sleep()
{
System.out.println("sleep");
}
void smoke()
{
System.out.println("抽烟");
}
}
class ZhangSan extends Student
{
void study(){}
void smoke(){}
}
void smoke()
这个不是每个子类都需要有的功能,可以单独成接口,被某些需要用到的子类扩展
abstract class Student
{
abstract void study();
void sleep()
{
System.out.println("sleep");
}
}
interface Smoking
{
public abstract void smoke();
}
//子类zhangsan继承了父类Student,并实现了接口Smoking
class ZhangSan extends Student implements Smoking
{
void study(){}
public void smoke(){}
}
//子类lisi只继承了父类Student
class Lisi extends Student
{
void study(){}
}