这篇文章主要是自己在使用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的更多相关文章

  1. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  2. Java中interface和abstract class的区别和联系

    interface: interface类似于class,但是只包含函数(只规定参数.函数名.返回类型,不规定函数体).目的是用来建立类和类之间的一种“协议”.一个类可以实现多种接口,来模拟多重继承. ...

  3. java实际项目中interface和abstract interface 区别

    参考:https://zhidao.baidu.com/question/424485344260391052.html 这2种有什么区别,根据实际项目经验 帮我解答下 谢谢啊~~~~~~~~~问题补 ...

  4. 在C#中interface与abstract class的区别

    1)在继承抽象类时,必须覆盖该类中的每一个抽象方法,而每个已实现的方法必须和抽象类中指定的方法一样,接收相同数目和类型的参数,具有同样的返回值,这一点与接口相同. 2)当父类已有实际功能的方法时,该方 ...

  5. [转]Objective-c中@interface、@implementation、@protocal

    原处:http://blog.csdn.net/l271640625/article/details/8393531 以下Objective-c简称OC 从事java开发的程序员们都知道,在java中 ...

  6. Java 反射在实际开发中的应用

    运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...

  7. java注解及在butternife中的实践和原理

    1.  背景 之前去一个公司,说到了java的注解,问java的注解有几种方式,然后我提到了android中的butternife和afinal注解工具,我们知道butternife在6.1版本的时候 ...

  8. [转]Java 反射在实际开发中的应用

    一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2  :RTT ...

  9. javac 编译源文件出现"java:1: 需要为 class、interface 或 enum"、" [javac] 锘縫"错误

    [javac] HelloWorld.java:1: 需要为 class.interface 或 enum [javac] 锘縫ackage com.csdn.demo; [javac] ^ [jav ...

随机推荐

  1. c++的string容器

    c++相比c的一个好处就是实现了很多的容器和泛型算法,使得程序员的工作得到了很大的化简.其中一个很有用的泛型容器就是string.string是一个类,是一个在STL里边实现好了的类,由于他的很多功能 ...

  2. POJ 1664 把苹果

     把苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25785   Accepted: 16403 Descript ...

  3. 【C++基础】类的组合

    所谓类的组合是指:类中的成员数据是还有一个类的对象或者是还有一个类的指针或引用.通过类的组合能够在已有的抽象的基础上实现更复杂的抽象. 比如: 1.按值组合 #include<iostream. ...

  4. SQLServer 使用 @@ERROR

    原文:SQLServer 使用 @@ERROR 使用 @@ERROR 如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0:如果此语句产生错误,则 @@ERROR ...

  5. CSharp设计模式读书笔记(19):备忘录模式(学习难度:★★☆☆☆,使用频率:★★☆☆☆)

    备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态.它是一种对象行为型模式,其别名为Tok ...

  6. POJ 2109 :Power of Cryptography

    Power of Cryptography Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18258   Accepted: ...

  7. LogMaster4Net

    使用LogMaster4Net实现应用程序日志的集中管理 日志在软件系统中的重要性我在此也不赘述了,几乎所有程序员每天都会更日志打交道. 那么你是否曾今为这样的一些事情而困扰过: - 远程登录到不同的 ...

  8. pinyin4j新手教程

    Pinyin4j新手教程 pinyin4j是一个支持将简体和繁体中文转换到成拼音的Java开源类库,作者是Li Min (xmlerlimin@gmail.com). 下面是一些详细的介绍和使用方式. ...

  9. Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录

    1.首先在mysql创建一个存用户的表格 create table test_user ( user_id bigint(20) unsigned not null auto_increment co ...

  10. 多线程编程 (1) -NSThread

    每个iOS应用程序都有个专门用来更新显示UI界面.处理用户触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将那 ...