Java(5/6和8)中interface和Abstract Class
这篇文章主要是自己在使用java的过程中对自己一些之前常困惑的问题的一些总结。
正如题目所言,这篇博客主要是讨论java中的接口与抽象类的区别,有自己的使用心得,以及自己平时在使用的过程中遇到的问题及解决方案。
1, 定义上的区别:
其实说别的抽象意义都不会让人明白,只有java语言级别上的区别才能根本上区别两者:java中"everything is an object", 所以接口理论上讲也是一种对象,或者叫类. 它的定义是: 以关键字interface取代class定义的类就是接口, 形如: public interface IA{};而抽象类的定义呢,则是: 以关键字abstract修饰的类定义. 形如: public abstract class A {}. 其它的定义如"含有抽象方法的类是抽象类"等等都不准确.
2, 使用上的区别:
接口只有用来"implements", 即实现。而且一个类可以同时实现多个接口。而抽象类是用来"extends"的, 即继承。一个类只能继承一个抽象类。假如类B继承了抽象类A, 则B要么实现了其中的抽象方法,要么将自己声明为abstract. 此外没有别的解决方案.
3, 成员上的区别:
接口中的成员变量默认情况是public static final的,想像一下为什么会如此呢?大概是接口原本就是要让其它的类来实现的,里面的成员变量就是要让接口之外的类来使用的,所以吧,private是不行的,protected和defaut的都是有限制的。而且接口又不可能被实例化,也得自己不会去更改变量的值,别的类也不会改变接口的成员变量值,因为,如果B和C都实现了IA接口,而B修改了IA中的成员变量的值,而C如果使用了该变量的值,它是要使用该变量的原值还是修改之后的值,这个就让人混淆了,所以就是static跟final的了吧. 但是在抽象类中,可以定义任何权限的成员变量: public private protected或default的、static或non-static的、final或non-final的。
然后是两者中的成员函数.
接口中的成员函数,默认是public的,形如: void get(int i);正如上所言,它们就是用来被别的类来实现的, 且不得是static或final的。与此同时,接口中的所有方法只能有方法声明,不能有方法体,即使方法体中不实现任何操作。 而在抽象类中如果有要求被子类实现的方法,则该方法用关键字abstract修饰, 形如:public abstract void method();. 抽象类中可以含有抽象方法,当然,也可以完全不含有抽象方法(此时该类当然依旧可以用abstract修饰,但已经毫无意义,因为抽象方法原本就是要求子类实现其中的抽象方法的)。而且抽象类中的非抽象方法可以调用抽象方法,例如:public void f(){method();}, 但在接口中却不能如此,因为接口中方法声明不得含有方法体, 没有方法体自然无法调用其它方法. (java中的抽象方法源于c++中虚函数的概念,虚函数要求派生类覆盖该函数,然后该继承体系中的基类和派生类在运行时调用该虚函数时,基类调用基类的版本,派生类调用派生版本,这种编译器只有在运行时才能确定调用哪个版本的机制叫做"动态绑定", c++中一个基类类型的指针或引用被赋予了一个派生类型的指针或引用时,常会遇到这种问题。java中亦有如此概念,我想对java熟悉的同行肯定知道这个概念。)
4, java 8中的接口与抽象类.
以上所述接口与抽象类的区别是java 6中的概念。
java 8终于在开发人员的苦苦等等下于今年3月份发布了,这个java 8对java语言的更新和拓展,其意义绝不亚于java 5/6的出现。在这里单独讲述一下java 8中有关接口与抽象类的问题。
其实java 8基本上没有对抽象类带来什么变化,相反,对接口的带来的巨大的改变。
首先java 8对接口带来了"功能接口"(Functional Interface)的概念. 我们知道java中定义的接口是十分脆弱的,如java库的Runnable接口和Callable接口,他们只有一个方法run()和call(), 此外再没有别的什么东西,也不能对这两个接口进行拓展.
java 8中引入的接口注解FunctionalInterface, 使得接口可以对自己添加方法声明来进行拓展, 例如:
@FunctionalInterface
public interface Functional {
void method();
}
java 8库中的Runnable和Callable接口已经实现了这个功能。喜欢尝鲜的同行已经可以尝试这个功能了。
4.1, java 8中接口的默认方法和静态方法.
java 8在接口引入了默认方法和静态方法的概念。同时FunctionalInterface并不会影响default方法和static方法。
java 8中的default方法和static方法的使用示例如下:
public interface DefaulableFactory {
// Interfaces now allow static methods
static Defaulable create( Supplier< Defaulable > supplier ) {
return supplier.get();
} private interface Defaulable {
// Interfaces now allow default methods, the implementer may or
// may not implement (override) them.
default String notRequired() {
return "Default implementation";
}
} private static class DefaultableImpl implements Defaulable {
} private static class OverridableImpl implements Defaulable {
@Override
public String notRequired() {
return "Overridden implementation";
}
} public static void main( String[] args ) {
Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
System.out.println( defaulable.notRequired() ); defaulable = DefaulableFactory.create( OverridableImpl::new );
System.out.println( defaulable.notRequired() );
} }
最新版本中的接口其default和static方法, 其出现已经可以取代抽象类了(比如接口中方法全部都是default或者static方法,此时类似于抽象类中没有定义抽象方法一样),不知道抽象类还有没有存在的意义?这个问题值得思考。
如果你对java 8期待了很久,看到这些是不是让人感动很兴奋???好吧,我是这样感觉的,已经读了一些关于java 8中新特性的文章,在接下来的时间里面会陆续总结并更新出来。要在java的世界里面马不停蹄啊!
Java(5/6和8)中interface和Abstract Class的更多相关文章
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
- Java中interface和abstract class的区别和联系
interface: interface类似于class,但是只包含函数(只规定参数.函数名.返回类型,不规定函数体).目的是用来建立类和类之间的一种“协议”.一个类可以实现多种接口,来模拟多重继承. ...
- java实际项目中interface和abstract interface 区别
参考:https://zhidao.baidu.com/question/424485344260391052.html 这2种有什么区别,根据实际项目经验 帮我解答下 谢谢啊~~~~~~~~~问题补 ...
- 在C#中interface与abstract class的区别
1)在继承抽象类时,必须覆盖该类中的每一个抽象方法,而每个已实现的方法必须和抽象类中指定的方法一样,接收相同数目和类型的参数,具有同样的返回值,这一点与接口相同. 2)当父类已有实际功能的方法时,该方 ...
- [转]Objective-c中@interface、@implementation、@protocal
原处:http://blog.csdn.net/l271640625/article/details/8393531 以下Objective-c简称OC 从事java开发的程序员们都知道,在java中 ...
- Java 反射在实际开发中的应用
运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...
- java注解及在butternife中的实践和原理
1. 背景 之前去一个公司,说到了java的注解,问java的注解有几种方式,然后我提到了android中的butternife和afinal注解工具,我们知道butternife在6.1版本的时候 ...
- [转]Java 反射在实际开发中的应用
一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2 :RTT ...
- javac 编译源文件出现"java:1: 需要为 class、interface 或 enum"、" [javac] 锘縫"错误
[javac] HelloWorld.java:1: 需要为 class.interface 或 enum [javac] 锘縫ackage com.csdn.demo; [javac] ^ [jav ...
随机推荐
- 创建线程的两种方式:继承Thread类和实现Runnable接口
第一种方式:继承Thread类 步骤:1.定义类继承Thread 2.覆写Threa类的run方法. 自定义代码放在run方法中,让线程运行 3.调用线程的star方法, 该线程有两个作用:启动线程, ...
- wordpress常见的问题
nginx如webserver,wordpress上传主题错误 413 Request Entity Too Large 解决: vim /usr/local/nginx/conf/nginx.con ...
- python 架构简介(转)
前言: 开发语言python 越来越火 ,作为开发比较火的语言,python 对网页等的支持也很好,当你想用python来写网页的时候你就要选择框架了.到底要选择呢什么样子的框架,最适合你的项目 ...
- Python - 缩写(capwords) 和 创建转换表(maketrans) 详细说明
缩写(capwords) 和 创建转换表(maketrans) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27051 ...
- The Stern-Brocot Number System(排序二进制)
The Stern-Brocot Number System Input: standard input Output: standard output The Stern-Brocot tree i ...
- Unix命令操作
基本命令 [ man 查看 ]--万能命令 1.ls 列出文件 (-al) 2.cd 转换目录 3.mkdir 建立新目录 4.cp 拷贝文件 (-R) 5.rm 删除文件 (-rf) 6.mv 移动 ...
- 【百度地图API】建立全国银行位置查询系统(一)——如何创建地图
原文:[百度地图API]建立全国银行位置查询系统(一)--如何创建地图 <摘要>你将在第一章中学会以下知识: 如何创建一个网页文件 怎样利用百度地图API建立一张2D地图,以及3D地图 如 ...
- STL慎重选择删除元素的
一.要删除容器中有特定值的全部对象 1.假设容器是vector.string或deque.则使用erase-remove习惯使用方法.比如: vector<int> c; c.era ...
- MapReduce的InputFormat学习过程
昨天,经过几个小时的学习.该MapReduce学习的某一位的方法的第一阶段.即当大多数文件的开头的Data至key-value制图.那是,InputFormat的过程.虽说过程不是非常难,可是也存在非 ...
- fast-json.jar的用法
fast-json.jar 解析json数据:一种json数据解析方式是这种,点击这里下载jsonfast.jar+fastjsonAPI文档 [ { "id": 6378, &q ...