因为java不支持类的多继承,所以就有了接口,接口是方法特征的集合
定义接口的规则
- 接口被关键字interface修饰
- 接口的成员变量都是public static final 来修饰的
- 接口的方法默认都是public abstract来修饰的
- 类实现接口的关键字implements , 继承接口后一定要实现接口中的所有抽象方法。
- 如果一个类继承接口,却未实现它的抽象方法,那么该类一定是抽象方法
- 接口中没有构造方法,接口要通过类继承它来实例化
- 接口可以继承接口
用子类继承某个抽象类或者接口实例化出来的对象,只能调用其父类或者接口中的方法,但是用子类直接实例化出来的对象,就可以调用接口和抽象类的全部方法
Eat接口
public interface Eat {
void eat();
}
Run接口
public interface Run {
void run();
}
Anminal抽象类
public abstract class Anminal {
public void jump() {};
public void drunk() {};
}
定义一个类
public class Cow extends Anminal implements Eat,Run{
@Override
public void run() {
System.out.println("牛在跑。。。。");
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("牛在吃草。。。。。。");
}
public void jump() {
System.out.println("牛在跳。。。。");
}
public void drunk() {
System.out.println("牛在喝水。。。。");
}
public void flay() {
System.out.println("牛在飞。。。。。");
}
}
测试类
public class Test{
public static void main(String[] args) {
//父类只能调用父类的方法
Anminal cowAnminal = new Cow();
cowAnminal.drunk();
cowAnminal.jump();
//eat接口只能调用eat接口的方法
Eat Coweat = new Cow();
Coweat.eat();
//run接口只能调用run接口的方法
Run cowRun = new Cow();
cowRun.run();
//cow自身可以调用所有方法
Cow cow = new Cow();
cow.drunk();
cow.eat();
cow.jump();
cow.flay();
}
}
接口的多继承:
接口支持多继承,继承接口的关键字就是extends
一个类如果继承C接口就必须都要实现A和B俩个接口
public interface A {
void test1();
}
public interface B {
void test2();
}
public interface C extends A,B {
void test3();
}
//实现类要是实现C接口的话,需要把C,A,B接口中所有的方法都是实现
public class D implements C {
@Override
public void test3() {
}
@Override
public void test1() {
}
@Override
public void test2() {
}
}
在类中,接口还可以这样使用
Runnable a =new Runnable() {
@Override
public void run() {
System.out.println("bbb");
}
};
最后案例:接口回调;
先有接口的使用者,最后再有接口的实现者
定义Usb接口
public interface Usb {
void service();
}
先定义接口的使用者
public class Computer {
Usb usb1;
Usb usb2;
Usb usb3;
public void run() {
System.out.println("电脑开始正常工作。。。");
if (usb1 !=null) {
usb1.service();
}
if (usb2 !=null) {
usb2.service();
}
if (usb3 !=null) {
usb3.service();
}
}
}
然后再定义接口的实现者
public class Upan implements Usb{
@Override
public void service() {
System.out.println("U盘正常启动。。。");
}
}
public class Mouse implements Usb{
@Override
public void service() {
System.out.println("鼠标正常使用。。。");
}
}
public class Feng implements Usb{
@Override
public void service() {
System.out.println("风扇正常使用。。。");
}
}
定义测试类
public class Test{
public static void main(String[] args) {
Computer computer = new Computer();
computer.usb1 = new Mouse();
computer.usb2 = new Upan();
computer.usb3 = new Feng();
computer.run();
}
}
使用接口的好处:
- 可以实现解耦,面向对象最好要实现高内聚,低耦合的思想
- 可以提高程序的可扩展性
接口和抽象类的区别:
- 接口中的方法实现默认都是public,并且接口中不允许写具体的实现方法(jdk8后default修饰的方法可以写方法)
- 接口中的成员变量是final修饰的,而抽象类不一定
- 一个类只能继承一个抽象类,而可以继承多个接口
- 一个类实现接口,就要实现它全部的方法,因为接口的方法就是全部都是抽象的,而抽象类不需要,只需要实现抽象方法就好了
- 接口不能直接new出来,但是可以通过多态来实例化出来
抽象类是在类的层面上,是一种模板设计,而接口是行为的抽象,是一种行为的规范