纳尼,接口中可以定义实例方法了?!

纳尼,接口中还可以定义静态方法了?!

没错,在Java8中新增了很多新的特性,其中就包括可以在接口中添加方法和变量。

首先我们来看下代码

 public interface SourceInterface
{
int a = 5;
int b = 10; public static int add()
{
return a + b;
} public static void reset()
{
// do sth
} public default int f1()
{
return a;
} public default void f2()
{
// do sth
}
} class learnCode
{
public void userInterface()
{
int xx = SourceLearning.add();
SourceLearning.reset();
SourceLearning instance = new SourceLearning()
{
@Override
public void f2()
{
// do sth 、
}
};
instance.f1();
instance.f2();
//int y=instance.add(); 注意这句会编译错误
}
}

代码中,我们可以发现以下几点不同:

1、在接口中,可以直接添加静态方法。

该静态方法作为接口(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )的类方法,可以直接使用。不需要依托某个实现类。

2、在接口中,可以直接添加非抽象的实例方法。

在实例方法的申明中,需要增加default关键字修饰,因此这种方法也称为默认方法。他是接口自带的方法。接口被实现后,实例可以直接使用这些默认方法,同时如果对默认方法需要重写时,可以直接重写即可。

这两点新特性相对于java8之前的版本来说,可以说有质的改变。

引申:

可以增加方法的接口,开始变的更像抽象类。Java类在实现了多个拥有默认方法的接口后,从侧面展现的像是实现了多重继承的影子。

注意:如果两个接口的默认方法出现重复申明,则需要在实现方法中重写该方法,否则jvm在执行时,无法确定究竟应该使用哪个接口的同名方法。这应该可以算是本次新引入特性的一个弊端,如果是指定使用的是某个接口中的默认方法时,可以采用

 @Override
public void f2()
{
SourceLearning.super.f2();
}

的形式

那么,java为什么要引入默认方法呢?如果需要往接口中添加方法,直接使用抽象类即可,为什么要破坏已有的约定呢?

我认为主要原因如下:

在面向接口的编程过程中,发现原有的接口中,都需要添加一个相同的方法,那么现在有两种方案:

1)接口换抽象类,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )抽象类中添加该方法

2)接口中添加该抽象方法,在每一个接口的实现类中,均添加相同的实现方法。

无论选择哪种方法,都需要对已有的代码做出非常大的改动。可是如果使用默认方法,使对接的接口默认就拥有某些功能的实现,则很好的解决了假设的问题。

纳尼,java可以在接口中实现非抽象方法了?的更多相关文章

  1. [改善Java代码]在接口中不要存在实现代码

    第3章  类.对象及方法 书读得多而不思考,你会觉得自己知道的很多. 书读得多而思考,你会觉得自己不懂的越来越多. —伏尔泰 在面向对象编程(Object-Oriented Programming,O ...

  2. java的抽象类和抽象方法(注意查看如何调用抽象类中的非抽象方法)

    抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类.抽象类有点类似“模板”的作用,目的是根据其格式来创建和修改新的类.对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子 ...

  3. java:在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作

    在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作 //在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作 List<String> a ...

  4. java如何引入接口中定义的常量

    接口 (A.java) : package config; public interface A { String PROJECT_ROOT_DIR = System.getProperty(&quo ...

  5. Java容器---Collection接口中的共有方法

    1.Collection 接口 (1)Collection的超级接口是Iterable (2)Collection常用的子对象有:Map.List.Set.Queue. 右图中实现黑框的ArrayLi ...

  6. Java小程序---接口中抽象方法的实现(解决了JAVA语言不能多继承的问题)

    public interface Sing { public static final String eyecolor="black"; public void sleep(); ...

  7. JAVA抽象类,接口,多态,抽象方法,一次列举

    HEAD FIRST这系列的书,真的让人产生阅读的快感~~:) 和那套明日科技的一样,.. interface Nose { public int iMethod(); } abstract clas ...

  8. 我要告诉你:java接口中可以定义private私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  9. java学习之接口、多态和内部类

    接口是一组行为的规范.定义.接口是面向对象编程体系中的思想精髓之一,使用接口可以让我们的程序更加利于变化. 接口的格式: interface 接口名称{ 全局变量: 抽象方法: } 接口中的成员修饰符 ...

随机推荐

  1. MySQL生成模型

    根据数据库表生成Model using System; using System.Collections.Generic; using System.Data; using System.Text; ...

  2. sqlserver跨服务器数据库sql语句

    1.启用Ad Hoc Distributed Queries:exec sp_configure 'show advanced options',1reconfigureexec sp_configu ...

  3. 免费领取百度云盘2048G永久空间,永久离线下载特权

    百度云盘和360云盘之间的竞争可谓争锋相对,前段时间,百度和360就网盘免费都采取了自己的措施,最终,360一锤定音,直接免费送36T,并且如果你超过了36T的容量,还可以自动免费扩容! 可参看文章: ...

  4. 不可变字符串NSString

    /*字符串的常用方法*/ //1.通常用来把一些基本数据类型和字符串进行拼接 ; float b = 9527.0; NSString *string = [NSString stringWithFo ...

  5. Django URL name详解

    我们基于上一节的代码来开始这一节的内容. 上节源代码:zqxt_views(django 1.4 - django 1.10).zip [更新于 2016-09-06 00:13:23] 1. 打开 ...

  6. chrome浏览器 模拟访问移动端

    谷歌Chrome浏览器,可以很方便地用来当3G手机模拟器.在Windows的[开始]-->[运行]中输入以下命令,启动谷歌浏览器,即可模拟相应手机的浏览器去访问3G手机网页: 谷歌Android ...

  7. Heartbeat+DRBD+MySQL高可用方案

    1.方案简介 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由DRBD这个工具来保证.默认情况下只有一台mysql在工作,当主mysql服务器出现问题后,系统将自 ...

  8. 20145205《Java程序设计》课程总结

    每周读书笔记链接汇总 20145205 <Java程序设计>第1周学习总结 20145205<Java程序设计>第2周学习总结 20145205 <Java程序设计> ...

  9. DevOps is dirty work - Dream in One-Click

    真是一晃就到年底,年初许的梦想实现了吗?这么残忍的问题还是不要知道答案了吧:) 这恍若隔世的大半年,不仅没有承接着上篇继续聊Continuous Delivery (CD),反而疑似荒废.然而,梦想还 ...

  10. VS2013菜单栏文字全大写的问题

    从VS2010转到VS2013,2013新增的很多功能确实很方便,只是有一点,菜单栏文字变成全大写了,看着有点不习惯. 打开注册表编辑器,找到 HKEY_CURRENT_USER\Software\M ...