Java接口在1.8之后发生了重大变化。所以谈Java接口特点可以分为1.8版本之前和1.8版本之后。
1.8版本之前的特点:
- 接口里只能有静态全局常量和public修饰的抽象方法。
- 为了代码简洁,在接口中方法可以不用public和abstract修饰,但是编译后的方法仍然是public abstract类型的方法。全局常量也可以用public static fianl修饰,同样编译后仍然为public static final类型。
下面代码演示了一个如何定义一个1.8版本之前的接口:
public interface IFlyable { String info = "静态常量"; void fly(); }
上面代码尽管没有用public static final修饰info,但编译后info为静态全局常量,外部不能修改值。同样fly()没有用public abstract修饰,但编译结果是public abstract类型。
下面是测试代码:
1 package org.lyk.vo; 2 3 import org.lyk.intefaces.*; 4 5 public class Bird implements IFlyable 6 { 7 public void fly() 8 { 9 System.out.println("鸟儿在飞翔"); 10 } 11 }
1 package org.lyk.main; 2 3 import org.lyk.intefaces.*; 4 import org.lyk.vo.*; 5 6 public class Hello 7 { 8 public static void main(String[] args) 9 { 10 IFlyable flyAble = new Bird(); 11 flyAble.fly(); 12 System.out.println(IFlyable.info); 13 } 14 }
1.8 版本之后的特点:
- 打破了1.8之前接口里只能有全局静态常量和public抽象方法的限制。允许接口中用default关键字修饰的实体方法出现(该方法在子类中可以被覆写)
- 也允许在接口中定义public static 类型的实体函数,该静态由接口调用。
1 package org.lyk.intefaces; 2 3 public interface IFlyable 4 { 5 public static final String info = "静态常量"; 6 public abstract void fly(); 7 8 public static void showSomething() 9 { 10 System.out.println("这是Java1.8才支持的静态函数,该函数只能由接口调用"); 11 } 12 13 default void printSomething() 14 { 15 System.out.println("这是Java1.8才支持的default实体函数.该方法可以在子类中被覆写。"); 16 } 17 }
测试代码:
1 package org.lyk.vo; 2 3 import org.lyk.intefaces.*; 4 5 public class Bird implements IFlyable 6 { 7 public void fly() 8 { 9 System.out.println("鸟儿在飞翔"); 10 } 11 12 public void printSomething() 13 { 14 System.out.println("在子类中覆写接口方法"); 15 } 16 }
1 package org.lyk.main; 2 3 import org.lyk.intefaces.*; 4 import org.lyk.vo.*; 5 6 public class Hello 7 { 8 public static void main(String[] args) 9 { 10 IFlyable flyAble = new Bird(); 11 flyAble.fly(); 12 System.out.println(IFlyable.info); 13 14 15 flyAble.printSomething(); 16 IFlyable.showSomething(); 17 } 18 }
后记: 我想,Java1.8之所以做出如此大的设计上的改变,应该是为了向.net学习,目的是支持流(stream)。因为Java一开始设计的时候没有考虑到stream这种场景出现,现在要在接口中增加功能,就必须打破原有限制。