Java中接口的特点

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这种场景出现,现在要在接口中增加功能,就必须打破原有限制。

原文地址:https://www.cnblogs.com/kuillldan/p/6286287.html