定义:接口比抽象类更抽象。接口是是一种规范,定义了某些类需要遵守的规范。接口不提供实现。接口是与类同等级的,把接口视为特殊的类,把定义类时的class关键字改成interface就是接口了。接口是规范与实现分离的设计哲学。
语法:
[public] interface 接口名 extends 父接口1,父接口2…
{
语句;
}
·定义接口的修饰符只能是public或默认的包访问控制修饰符。
·接口中不能定义构造器和初始化块。
·接口中定义的方法只能是抽象方法。所以不能在接口中定义类方法跟普通方法。可以使用abstract关键字修饰抽象方法,也可以不写,总之都使用public abstract修饰。
·接口中定义的属性值只能是常量,在声明变量时候必须赋值。必须使用public static final 3个修饰符,所以默认可以不写修饰符就是这3个修饰符。
·接口中定义的内部类,接口,枚举都是用 publicstatic 修饰符。不管你写与不写。
·接口中修饰符要么只能是public,要么不写默认会给你加上相应的修饰符。
·接口的继承
·接口支持多继承,就是一个接口可以有多个直接父接口。多个父类以逗号隔开。
·与类一样,子接口继承父接口的属性和方法。
·使用接口
·接口类型的引用指向实现该接口类的对象也是多态。
·类实现接口使用implements关键字,并且一个类可以实现多个接口,将接口名使用逗号隔开。
·类实现接口同时也会继承接口中的属性和方法,内部类和枚举。
·跟实现抽象类一样,要么实现接口中所有的抽象方法,要么该类也要定义成一个抽象类。
·子类重写接口方法后根据子类重写父类方法,子类权限要大于等于父类方法权限,所以子类权限还为public
·实现接口除了使用implements关键字之外,使用匿名内部类也能实现接口和抽象类的抽象方法。
例子:类实现接口
//定义一个接口 public interface Output { int MAX = 5; void out(); //接口中的抽象方法 void getDate(String msg); } ---------------------------------------- interface Product { int getProduceTime(); } public class Printer implements Output,Product //使用implements实现接口,实现接口会继承接口的属性和方法等 { private String[] printData = new String[MAX]; private int dataNum = 0; // public void out() //实现接口中的抽象方法 { while(dataNum > 0) { System.out.println(printData[0]); System.arraycopy(printData,1, printData,0, --dataNum); //复制n个长度的数组 } } // public void getDate(String msg) //实现接口中的抽象方法 { if(dataNum >= MAX) { System.out.println("list full"); } else { printData[dataNum++] = msg; } } public int getProduceTime() { return 45; } public static void main(String[] args) { Output o = new Printer(); //接口的引用变量指向实现该接口类的对象,这也是多态的一种。 o.getDate("a"); o.getDate("b"); o.out(); o.getDate("C"); o.out(); Product p = new Printer(); System.out.println(p.getProduceTime()); Object obj = p; //所有接口类型的引用变量都能赋值给Object类型的变量,这也是向上类型转换 } }
·接口与抽象类的区别
a) 接口里只能包含抽象方法,抽象类中可以包含普通方法。
b) 接口中不能定义静态方法,抽象类中可以定义静态方法。
c) 接口中的属性只能是类属性,而抽象类中可以定义对象属性和类属性。
d) 接口中不能定义初始化块,抽象类可以定义初始化块。
e) 接口里不能定义构造器,抽象类中可以定义构造器,但不能用于创建对象,而是在其子类创建子类的对象时来调用这个构造器来完成抽象类的初始化操作。
f) 一个类可以实现多个接口,但一个类只能有一个直接父类,包括抽象类。
g)一个类实现抽象类是使用extends继承,而实现接口则是implements实现。他们都可以使用匿名内部类来实现。