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类型。

下面是测试代码:

 package org.lyk.vo;

 import org.lyk.intefaces.*;

 public class Bird implements IFlyable
{
public void fly()
{
System.out.println("鸟儿在飞翔");
}
}
 package org.lyk.main;

 import org.lyk.intefaces.*;
import org.lyk.vo.*; public class Hello
{
public static void main(String[] args)
{
IFlyable flyAble = new Bird();
flyAble.fly();
System.out.println(IFlyable.info);
}
}

1.8 版本之后的特点:

  • 打破了1.8之前接口里只能有全局静态常量和public抽象方法的限制。允许接口中用default关键字修饰的实体方法出现(该方法在子类中可以被覆写)
  • 也允许在接口中定义public static 类型的实体函数,该静态由接口调用。
 package org.lyk.intefaces;

 public interface IFlyable
{
public static final String info = "静态常量";
public abstract void fly(); public static void showSomething()
{
System.out.println("这是Java1.8才支持的静态函数,该函数只能由接口调用");
} default void printSomething()
{
System.out.println("这是Java1.8才支持的default实体函数.该方法可以在子类中被覆写。");
}
}

测试代码:

 package org.lyk.vo;

 import org.lyk.intefaces.*;

 public class Bird implements IFlyable
{
public void fly()
{
System.out.println("鸟儿在飞翔");
} public void printSomething()
{
System.out.println("在子类中覆写接口方法");
}
}
 package org.lyk.main;

 import org.lyk.intefaces.*;
import org.lyk.vo.*; public class Hello
{
public static void main(String[] args)
{
IFlyable flyAble = new Bird();
flyAble.fly();
System.out.println(IFlyable.info); flyAble.printSomething();
IFlyable.showSomething();
}
}

后记: 我想,Java1.8之所以做出如此大的设计上的改变,应该是为了向.net学习,目的是支持流(stream)。因为Java一开始设计的时候没有考虑到stream这种场景出现,现在要在接口中增加功能,就必须打破原有限制。

Java中接口的特点的更多相关文章

  1. 转载 - java中接口的向上转型。和多态性

    发现一篇对接口总结很精简的文章 1.在java中接口就是一个完全抽象的类,跟抽象类一样不能产生对象,但是可以作为对象的引用,可以由其实现类向上转型,它就跟超类一样, 向上转型了,可以很好的利用接口,可 ...

  2. Java中接口和抽象类的比較

    Java中接口和抽象类的比較-2013年5月写的读书笔记摘要 1. 概述 接口(Interface)和抽象类(abstract class)是 Java 语言中支持抽象类的两种机制,是Java程序设计 ...

  3. 浅谈Java中接口与抽象类的异同

    浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...

  4. 关于java中接口定义常量和类定义常量的区别

    /** * * @author YZJ * @Description java中定义常量的最佳方法 */ public final class Contants{ /** * @Description ...

  5. java中接口之间的继承

    最近在读一些源码的时候突然发现了一个很神奇的东西,它的原始形态是这样的: 在这行代码中,BlockingDeque.BlockingQueue和Deque是三个接口.刚发现这个问题时,我是十分吃惊的, ...

  6. JAVA中接口与抛出异常的相关知识

    1.接口概念:接口可以理解为一种特殊的类,由全局常量和公共的抽象方法所组成. 类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只 ...

  7. java中接口和继承的区别

    实际概念区别:区别1:不同的修饰符修饰(interface),(extends)区别2:在面向对象编程中可以有多继承!但是只支持接口的多继承,不支持'继承'的多继承哦而继承在java中具有单根性,子类 ...

  8. Java中 接口是如何实现多态的特性的

    Java中多态是个很难理解的概念,但同时又是非常重要的概念,Java三大特性(封装.继承.多态)之一,我们从字面上理解,就是一种类型的多种状态,一下通过卖小汽车的例子再次说明什么是多态,其中利用到了接 ...

  9. java中接口的定义

    使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] interface 接口名 [ ...

  10. 浅谈java中接口与抽象类之间的异同

    刚学习java的时候,总觉得接口和抽象类很像,但又说不上具体有什么区别.今天静下来,翻翻书,查查资料,做个小结.首先举两个例子,看看interface和abstract class 在“外形”上有啥异 ...

随机推荐

  1. POST与GET请求的区别

    https://www.cnblogs.com/logsharing/p/8448446.html 返回主页 在途中# 博客园首页新随笔联系订阅管理 随笔 - 33 文章 - 5 评论 - 40 GE ...

  2. Day 62 Django第三天

    2.GET请求能够被cache,GET请求能够被保存在浏览器的浏览历史里面(密码等重要数据GET提交,别人查看历史记录,就可以直接看到这些私密数据)POST不进行缓存. 3.GET参数是带在URL后面 ...

  3. JavaScript基础语法及数组相关方法(1)

    day51 参考:https://www.cnblogs.com/liwenzhou/p/8004649.html <!DOCTYPE html> <html lang=" ...

  4. rocketmq学习

    官网地址 安装name server和broker git clone https://github.com/apache/incubator-rocketmq.git cd incubator-ro ...

  5. python爬虫1——获取网站源代码(豆瓣图书top250信息)

    # -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...

  6. 2019年北航OO第一次博客总结

    一.基于度量对程序结构的分析 1. 第一次作业 1.1 基于类的分析的度量 首先,基于类的属性个数,方法个数,每个方法的规模,每个方法的控制分支数目,类总代码规模等特征对本次作业的结构进行分析. 1. ...

  7. TestNG参数

    dependsOnMethods可以使测试用例按某个特定的顺序执行 实例: @Test(dependsOnMethods=“s”) public  void  a() System.out.print ...

  8. YYYY-mm-dd HH:MM:SS 时间格式

    YYYY-mm-dd HH:MM:SS部分解释 d               月中的某一天.一位数的日期没有前导零.    dd             月中的某一天.一位数的日期有一个前导零.   ...

  9. javascript数据结构与算法--二叉树遍历(后序)

    javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...

  10. Oracle sys或者system的默认密码

    Oracle的sys和system默认密码   system默认:manager sys默认:change_on_install 使用SQL Plus登录数据库时,system使用密码manager可 ...