接口
一、概念
- 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,java不支持多重继承。
- 有了接口,就可以得到多重继承的效果。
- 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现
1、实现接口类
class subClass implements InterfaceA{ }
- 一个类可以实现多个接口,接口也可以继承其他接口
2、接口的特点
- 用interface来定义
- 接口中的所有成员变量都默认是由public static final修饰的
- 接口中的所有方法都默认是由public abstract修饰的
- 接口没有构造器
- 接口采用不多层继承机制
二、接口定义举例
//TestIn.java 新建interface文件,不是class文件
public interface TestIn{
int ID = 1;//等同public static final int ID = 1;
void test();//public abstract void test();
}
//TestIn1.java 新建interface文件,不是class文件
public interface TestIn1{
void test1();
}
//TestInImp1.java
/**
一个类只能继承一个父类
一个类可以实现多个接口,多个接口用,分隔
*/
public class TestInImp1 implements TestIn,TestIn1{
@Override
public void test(){
}
@Override
public void test1(){
}
}
三、注意
- 实现接口的类中必须提供接口中所有方法的具体实现内容,方可实例化
- 接口的主要用途就是被实现类实现(面向接口编程)
- 与继承关系类似,接口与实现类之间存在多态性
- 如果一个类既要继承父类,又要实现接口,则先继承(extends),再实现接口(implements)
public class A extends Person implements TestIn,TestIn1
四、接口的作用
接口和抽象类很相似,好像接口能做的事用抽象类也能做,为什么还要用接口呢?
- 人类是由猴子进化来的,假如要是穿越回到过去,改变了猴子(猴子多了一个眼睛),对现在的人类会造成什么影响?
- 从这个假设上可以看出,父类需要的稳定的抽象,如果要父类老是在改,基于这个父类的子类,子类的子类等等这些子类都有受到影响。
- 有时我们又确实需要给父类增加一些方法,那么就不能直接在父类上下手,只能新建一个接口,在接口上扩展方法,其他需要的子类自行去实现接口
五、接口应用举例
1、用java描述会唱歌的厨子是个老师
//Person1.java
public abstract class Person1{
int age;
String name;
int sex;
public abstract void showInfo();
}
//厨艺的接口
//Cooking.java
public interface Cooking{
void fry();//炒菜
}
//唱歌的接口
//Sing.java
public interface Sing{
void singing();//唱法
}
//SCTeacher.java
/**
描述会唱歌的厨子是个老师
*/
public class SCTeacher extends Person1 implements Cooking,Sing{
String course;//教的科目
public void setInfo(){
super.age = 27;
super.name = "王富贵";
super.sex = 1;
this.course = "数学";
}
@Override
public void showInfo(){
System.out.println("会唱歌的厨子的老师的信息是:");
System.out.println(super.age);
System.out.println(super.name);
System.out.println(super.sex);
System.out.println(this.course);
}
@Override
public void fry(){
System.out.println(super.name + "老师拿手的厨艺是炒菜");
}
@Override
public void singing(){
System.out.println(super.name + "老师擅长美声唱法");
}
}
//Test.java
SCTeacher sct = new SCTeacher();
sct.setInfo();
sct.fry();
sct.singing();
2、一个类可以实现多个无关的接口
与继承关系类似,接口与实现类之间存在多态性
体现了对象的多态。
六、接口的其它问题
- 如果实现接口的类中没有实现接口的全部方法,必须将此类定义为抽象类
- 接口也可以继承另一个接口,使用extends关键字
七、关于接口和抽象类的总结
- 抽象类是对于一类事物的高度抽象,其中既有属性也有方法
- 接口是对方法的抽象,也就是对一系列动作的抽象
- 当需要对—类事物抽象的时候,应该是使用抽象类,好形成一个父类
- 当需要对一系列的动作抽象,就使用接口,需要使用这些动作的类去实现相应的接口即可