有时必须从几个类中派生出一个子类,继承它们所有的属性和方法,但是,Java不支持多继承,就有了接口,就可以得到多重继承的效果。
接口是抽象方法和常量值的定义的结合;
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只含有常量和方法的定义,而没有变量和方法的实现;
实现接口类:class SubClass implements interfaceA{}
一个类可以实现多个接口,接口亦可以继承其它接口;
接口的特点:
- 用Interface来定义;
- 接口中的所有成员变量都默认是由public static final 修饰的;
- 接口中的所有方法都是默认由public abstract修饰的;
- 接口没有构造器;
- 接口采用多层继承机制;
接口定义举例:
public interface Runner{ int ID = 1; void start(); public void run(); void stop(); }
实现接口的类中必须提供接口中的所有方法的具体实现,方可实例化,否则需要声明为抽象类;
接口的主要作用是被实现类实现;
与继承关系类似:接口和实现类中间存在多态性;
当存在继承和实现关系时,先继承后实现;
抽象类在新增抽象方法时存在问题:父类新增抽象方法,子类必须实现该抽象方法,否则子类必须声明为抽象类;
解决方法:新建一个接口,接口中为该抽象方法,让子类去实现;
举个例子:会唱歌的厨师是个好老师。
如果用抽象类来实现:老师--继承--厨师--继承--歌者--继承--人,但是老师、厨师、歌者之间并没有相应的关系;
如果用接口实现:老师--继承--人,然后老师实现厨师接口,老师实现歌者接口;
Person.java
package inf; public abstract class Person { String name; int age; int sex; abstract void showInfo(); }
Cooking.java
package inf; public interface Cooking { void fry(); }
Singing.java
package inf; public interface Singing { void singing(); }
SCTeacher.java
package inf; public class SCTeacher extends Person implements Cooking,Singing{ String course; public void setInfo() { super.name = "tom"; super.age = 12; super.sex = 1; this.course = "数学"; } public void showInfo() { System.out.println("姓名:"+super.name +" "+"年龄:"+super.age+" " +"性别:"+super.sex); System.out.println("教的课程是:"+this.course); } public void fry() { System.out.println("老师的炒菜很好"); } public void singing() { System.out.println("老师的唱歌很好"); } }
Main.java
package inf; public class Main { public static void main(String[] args) { SCTeacher sc = new SCTeacher(); sc.setInfo(); sc.showInfo(); sc.fry(); sc.singing(); // Cooking c = new SCTeacher(); // c.fry(); } }
输出:
姓名:tom
年龄:12
性别:1
教的课程是:数学
老师的炒菜很好
老师的唱歌很好