标签:接口
java8对接口进行了改进,允许在接口中定义默认方法,默认方法可以提供方法实现。
类是一种具体实现类,而接口定义了一种规范,接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可满足实际需要。
接口是从多个类中抽象出来的规范,接口不提供任何实现。接口体现的是规范和实现分离的设计哲学。
示例:[修饰符]interface 接口名 extends 父接口1,父接口2…{ }
接口名通常能够使用形容词
不管是否使用public static final修饰符,接口里的成员变量总是使用这三个修饰符来修饰。接口里定义的内部类、内部接口、内部枚举默认都采用public static 两个修饰符,系统会自动使用public static来对他们进行修饰
Output.java
package code;
public interface Output{
//接口里定义的成员变量只能是常量
int MAX_CACHE_LINE = 50;
//接口里定义的普通方法只能是public的抽象方法
void out();
void getDate(String msg);
//在接口中定义的默认方法,需要使用default修饰
default void print(String ... msgs){
for(String msg : msgs){
System.out.println(msg);
}
}
//在接口中定义的默认方法,需要使用default修饰
default void test(){
System.out.println("默认的test()方法");
}
//在接口中定义类方法,需要使用static修饰
static String staticTest(){
return "接口里的类方法";
}
}
default与访问控制符的default不同
java8允许在接口中定义默认方法,默认方法必须使用default修饰,该方法不能使用static修饰,默认方法会自动使用public修饰(必须使用)。由于默认方法并没有static修饰,因此不能直接使用接口来调用默认方法,需要使用接口的实现类的实例来调用这些默认方法。
在接口中定义类方法,必须使用static修饰,不能使用default修饰,而且自动为类添加public(必须使用)。类方法可以直接使用接口来调用
package code;
public class OutputFieldTest{
public static void main(String[]args){
System.out.println(code.Output.MAX_CACHE_LINE);
//code.Output.MAX_CACHE_LINE = 20;
System.out.println(code.Output.staticTest());
}
}
接口里的成员变量默认是使用public static final修饰的,不同包下也可以通过接口来访问接口里的成员变量。
接口支持多继承,
package code;
interface interfaceA{
int PROP_A = 5;
void testA();
}
interface interfaceB{
int PROP_B = 6;
void testB();
}
interface interfaceC extends interfaceA,interfaceB{
int PROP_C = 7;
void testC();
}
public class InterfaceExtendsTest{
public static void main(String []args){
System.out.println(interfaceC.PROP_A);
System.out.println(interfaceC.PROP_B);
System.out.println(interfaceC.PROP_C);
}
}
5
6
7
归纳:接口有如下用途:
示例:[修饰符]class 类名 extends 父类 implements 接口1,接口2…{ 类体部分}
implements必须放在extends部分之后
一个类实现了一个或多个接口后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是重写这些抽象方法),否则将保留从父接口那里继承到的抽象方法, 该类也必须定义成抽象类。
Printer.java
package code;
interface Product{
int getProduceTime();
}
public class Printer implements Output,Product{
private String[] printData = new String[MAX_CACHE_LINE];
private int dataNum = 0;
public void out(){
while(dataNum > 0){
System.out.println("打印机打印:" + printData[0]);
System.arraycopy(printData,1,printData,0 ,1);
--dataNum;
}
}
public void getData(String msg){
if(dataNum >= MAX_CACHE_LINE){
System.out.println("输出队列已满,添加失败");
}
else{
printData[dataNum++] = msg;
}
}
public int getProduceTime(){
return 45;
}
public static void main(String[]args){
Output o = new Printer();
o.getData("轻量级JavaEE企业应用实战");
o.getData("疯狂Java讲义");
o.out();
o.getData("疯狂Android讲义");
o.getData("疯狂Ajax讲义");
o.out();
o.print("孙悟空","猪八戒","白骨精");
o.test();
Product p = new Printer();
System.out.println(p.getProduceTime());
Object obj = p ;
}
}
打印机打印:轻量级JavaEE企业应用实战
打印机打印:疯狂Java讲义
打印机打印:疯狂Android讲义
打印机打印:疯狂Ajax讲义
孙悟空
猪八戒
白骨精
默认的test()方法
45
上面程序看出:Printer类实现了Output接口和Product接口,因此Printer对象既可直接赋给Output变量,也可直接赋给Product变量,仿佛Printer类既是Output类的子类,也是Product类的子类,这就是java提供的模拟多继承
Printer实现Output接口,即可获得Output接口中定义的print()和test()两个默认方法,因此Printer实例可以直接调用这两个默认的方法。
接口不能显式继承类,但所有接口类型的引用变量都可以直接赋给Object类型的引用变量。
共同特征:
接口类似于整个系统的“总纲”,制定了系统各模块应该遵循的标准,因此一个系统中的接口不应该经常改变,一旦接口被改变,对整个系统甚至其他系统的影响都是辐射式的,导致大部分类都需要重新改写。
抽象类所体现的是模块式的设计,它作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品。这个中间产品已经实现了系统的部分功能(那些已经提供实现的方法),但是需要完善。
区 别 | 接口 | 抽象类 |
---|---|---|
1 | 只能包含抽象方法和默认方法,不能为普通方法提供方法的实现 | 完全可以包含普通方法 |
2 | 不能定义静态方法 | 可以定义静态方法 |
3 | 只能定义静态变量,不能定义普通成员变量 | 既可以定义普通成员变量,也可以定义静态变量 |
4 | 不包含构造器 | 可以包含构造器,抽象类的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作 |
5 | 不能包含初始化块 | 完全可以包含初始化块 |
6 | 一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足 | 一个类最多只能有一个直接父类,包括抽象类 |
标签:接口
原文地址:http://blog.csdn.net/u014270902/article/details/43911007