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

  • 相关阅读:
    分享完整的项目工程目录结构
    2014年糯米网校
    高并发非自增ID如何设计?
    Asp.Net中使用Couchbase——Memcached缓存使用篇
    协作图(通信图)collaboration diagram
    解决java获取系统时间差8个小时 专题
    智言趣语
    Common class for judge IPV6 or IPV4
    判断参数是否符合要求的一个类
    Connection to https://dl-ssl.google.com refused的解决办法
  • 原文地址:https://www.cnblogs.com/kuillldan/p/6286287.html
Copyright © 2020-2023  润新知