接口的概述
接口技术用于描述类具有什么功能,但并不给出具体实现,类要遵从接口描述的统一规则进行定义,所以,接口是对外提供的一组规则,标准。
简单来说接口就是比抽象类还要抽象。(在接口中的方法默认有abstract)
接口的定义
定义接口使用关键字interface
interface 接口名 {};
类与接口时实现关系,用implements表示
class 类名 implements 接口名
创建接口的方式:在和创建类一样,只不过是创建一个接口文件
栗子:
创建一个
package dome4; public interface ab { //定义一个接口 public abstract void eat(); //接口方法默认有abstract }
创建一个类实现接口
package dome4; public class q implements ab{ @Override //重写 public void eat() { System.out.println("啃骨头"); } }
测试类
package dome4; public class Test { public static void main(String[] args) { //ab sm= new ab(); ab sm=new q(); sm.eat(); } }
接口创建对象的特点
接口不能实例化,如果要实例化接口,可以通过多态的方式实例化子类对象
接口的子类(实现类)可以是抽象类,也可以是普通类
接口继承关系的特点
接口与接口之间的关系
继承关系,可以多继承,格式;
接口extends 接口1,接口2,接口3......
继承和实现的区别
继承体现的是“is a”的关系,父类中定义共性内容
实现体现的是“like a"的关系,接口中定义扩展内容
类与接口之间的关系
类与类之间:
继承关系,只能单继承,不能多继承,但是可以多层继承
类与接口之间:
实现关系,可以单继承,不能多继承,但是可以多层继承
接口与接口之间:
继承关系,可以单继承,也可以多继承
总结:
对于一个类来讲,它的父类(继承关系)中定义的都是:共性内容
对于一个类来讲,它的接口(实现关系)中定义的都是:扩展内容
接口创建对象的特点
接口不能实例化,如果要实例化接口,可以通过多态的方式实例化子类对象
接口的子类(实现类)可以是抽象类,也可以是普通类
接口继承关系的特点
接口与接口之间的关系
继承关系,可以多继承,格式;
接口extends 接口1,接口2,接口3......
继承和实现的区别
继承体现的是“is a”的关系,父类中定义共性内容
实现体现的是“like a"的关系,接口中定义扩展内容
类与接口之间的关系
类与类之间:
继承关系,只能单继承,不能多继承,但是可以多层继承
类与接口之间:
实现关系,可以单继承,不能多继承,但是可以多层继承
接口与接口之间:
继承关系,可以单继承,也可以多继承
总结:
对于一个类来讲,它的父类(继承关系)中定义的都是:共性内容
对于一个类来讲,它的接口(实现关系)中定义的都是:扩展内容
接口成员方法的特点
成员变量
接口中只有成员常量,没有成员变量,因为接口中所有的变量都有默认的修饰符public static final
成员方法
JDK7及以前只有公有的、抽象方法:在方法前面都会默认有public abstract,如果没写,则系统会默认补上
public abstract 返回值类型 方法名();
JDK8以后,可以有默认方法和静态方法:如果是静态方法则需要用public default来进行声明,而静态方法直接用static就行了
非静态方法:public default 返回值类型 方法名(){}
静态方法:static 返回值类型 方法名(){}
JDK9以后,可以有私有方法private
private 返回值类型 方法名(){}
构造方法
接口不能够实例化,也没有需要初始化的成员,所以接口没有构造方法
栗子:
ackage dome5; public interface w { // //构造方法 // public w(); 需要注意的是接口中是没有构造方法的 //成员常量 public static final int NUM=10; //成员常量一般用大写 //JDK7及以前的写法 void eat(); public abstract void eat2(); //默认会有public abstract //JDK8多了两种写法 public static void open(){ //静态方法 System.out.println("我是JDK8的新特性"); }; public default void open2(){ //非静态方法 System.out.println("我是非静态方法"); } //JDK9可以有私有方法 private void openj(){ System.out.println("我是JDK9的新特性"); } }