Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的.

本文将从下面几个方面深入探讨一下Java 抽象类和接口

一.抽象类语法及规范

二.接口的语法及规范

三.抽象类和接口的区别 ,将从语义细节及设计层面两方面来描述

本文由本人查阅资料并结合自己理解所作,如果有理解不到位的地方,欢迎各位斧正.

一.抽象类

  抽象类使用 abstract class 来定义,如果一个类使用abstract 来定义,那么这个类就是抽象类.

  语法如下:  

abstract class className{}

  抽象类的设计就是用来被继承的,抽象类与普通类的区别如下:

  1.抽象类不能用来创建对象.

   如果一个类被定义为抽象类 如 public  class A{}, 使用 诸如 class A a = new A();等方法类试图创建一个A 对象,编译将会报错.

  2.抽象类的子类必须实现父类的抽象方法,否则这个子类也必须定义为抽象类

  3.抽象的方法不能定义为private,因为抽象方法必须被实现

     除了这两个方面,抽象类和普通的类的特性一致.

  特别说明:

   抽象类一般得有抽象方法,但这不是必须的.也就是一个抽象类里面的方法都可以是不抽象的.

     反过来,而如果一个类有抽象方法,那么这个类一定都是抽象类.

   另外:抽象类里面的抽象方法如果没有指定访问权限,那么为default 权限,即包内可见权限,并不是默认为public 权限,这个和普通类的机制一样的.

     这点需要特别注意,有人在博客里面说抽象方法的默认访问权限是pubulic,经过本人认证,这个是错误的.

二.接口

 接口被声明为 interface ,语法如下:

interface interfaceName{}

  接口是抽象的高度体现,有如下的特点:

  1.接口里的所有方面默认都是 public abstract的,也只能是public abstract 所以在接口里面定义方法,只需要定义方法名和返回类型即可.
   使用诸如  public int methodName{}  或者 public abstract  void methodName{} 类似的定义其实是多此一举.

   而试图用 protected 或者 private ,final ,static 等修饰接口中的方法,将会得到编译错误提示.

  2.接口里面也可以定义变量名,而他们默认将会是 public static  final 的,除了之外,变量名不予许使用其他的修饰名修饰.

   接口中 例如 private int a = 1; protected int b = 2 ;之类的语句将会提示编译错误.

   一般不在接口里面定义变量

  3.实现接口的类必须实现接口的所有方法,除非实现类也为抽象的.

  4. 不能使用new interfaceName 来创建接口对象。

三. 抽象类和接口的区别

  1.语义细节上

    抽象类是从本质上来说,他还是一个类(class),除了上面的一些特殊约定外,他和具体类的约定一致.但是接口不是类( an interface is not a class),接口和抽象类语义不同如下:

    1) 抽象类里面可以有构造器.而接口不可以

    2) 抽象类里面可以具有非抽象的方法,而接口中的所有方法都是public abstract 的,接口中的所有方法都是抽象的.

    3) 抽象类里面可以定义各种访问权限的成员变量. 但如果在接口中定义成员变量,他们只能是 public final static 的.

    4) 抽象类可以定义静态代码块,而接口不可以

    5) 子类可以只能继承一个抽象类,但是接口的实现类可以实现多个接口

  2.设计理念选择

    1)抽象类体现的是对事物的抽象.它是对整个类的一种抽象,这种抽象可以包含行为,属性的抽象.但是接口是针对行为抽象.比如

     猫和狗都是动物,他们都具有一些共同的特征..所以可以抽象出一个Animal 的抽象类,猫和狗都是Animal 的子类. 他们都具有一些动物的共同特征.猴子也是Animal 的子类. 芒果树不属于动物,所以他不能继承Animal

     猫和猴子都可以爬树, 但是他们爬树的方式不太一样.爬树是一种行为的抽象.这时,就应该将爬定义为接口 Climb  .里面定义行为 climb().

     猫和猴子的爬树行为不一样,在各自实现Climb 接口,里面在实现各自的爬树 climb() 即可.而狗不具有爬树的行为,所以他不能实现爬树的接口.

     而如果将Climb 定义为抽象类,那么 猫和猴子就是 Climb 的子类了!显然不合适.

    2)抽象类体现的是模板式设计的思想,子类自需继承父类即可以具有默认的行为,以后如果在父类增加一个新的非private或default 方法,他的子类会自动具有改新增的行为,子类代码不需要任何更改.

     而接口更多体现的一种规范,它是一种辐射式的设计思想.接口一旦发布,再修改的代价就会很大. 比如在如果接口里面增加一个新方法,它的所有实现类都必须增加这个方法的实现.

     接口类似于系统里面的总纲.而抽象类类似与系统中的中间产品,他们定义了一些具体的行为,也有更多的抽象行为,他们不能作为最终产品发布。

    

  

  

JAVA抽象类和接口的深入探讨的更多相关文章

  1. java抽象类与接口的区别及用法

    java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...

  2. Java 抽象类与接口总结

    一.为什么要使用抽象类?有什么好处? 抽象类是通用接口.不同的子类可以用不同的方法表示此接口.通用接口建立起一种基本形式,以此表示所有子类的共同部分. 必须覆写父类abstract抽象的方法  含有抽 ...

  3. 第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  4. Java抽象类和接口的比较

    一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...

  5. java抽象类与接口区别

    java抽象类与接口区别: abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstr ...

  6. Java抽象类和接口的区别(好长时间没看这种文章了)

    Java抽象类和接口的区别(好长时间没看这种文章了) abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的 ...

  7. Java 抽象类和接口的理解

    Java 抽象类和接口的理解 一.抽象类 为什么使用抽象类(个人理解): 面向对象的概念是,我们知道的所有的对象都是通过类来描绘的,如果类包含的信息不能描绘一个具体的对象,就需要抽象来解决了,意思是一 ...

  8. 记录:JAVA抽象类、接口、多态

    JAVA抽象类.接口.多态 1. 多态 定义 多态是同一个行为具有多个不同表现形式或形态的能力.(多态就是同一个接口,使用不同的实例而执行不同操作) 如何实现多态 继承和接口 父类和接口类型的变量赋值 ...

  9. Java——抽象类与接口的前世今生

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 1.抽象类: 当编写 ...

随机推荐

  1. PowerShell常用的.Net 、COM对象(New-Object、Assembly)、加载程序集

    #新建随机数对象实例:$Ran = New-Object System.Random$Ran.NextDouble() 有时候,要使用的实例的类保存在独立的库文件中,PowerShell默认未加载,会 ...

  2. SSH框架总结(框架分析+环境搭建+实例源代码下载)

    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是眼下较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...

  3. Windows下Redis的安装使用[转]

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  4. epoll使用实例说明

    之前一直在讲如何epoll如何好用,但是并没有实例来演示epoll的使用,下面我们就看一个服务器端使用epoll监听大量并发链接的例子. 首先看一下epoll的几个函数的介绍.1.epoll_crea ...

  5. android之listView定位到指定行同时隐藏输入键盘

    帮别人该bug遇到的一个问题,记录下来. listView.setSelection(a); 这个方法可以让让你的listview定位到指定行 但是如果紧接着执行隐藏输入键盘的代码,则会有bug,这个 ...

  6. Java基础知识强化之IO流笔记27:FileInputStream读取数据一次一个字节数组byte[ ]

    1. FileInputStream读取数据一次一个字节数组byte[ ]  使用FileInputStream一次读取一个字节数组: int read(byte[]  b) 返回值:返回值其实是实际 ...

  7. Android 高级UI设计笔记01:使用ExpandableListView组件(ListView的扩展)

    1.ExpandableListView是一个用来显示二级节点的ListView. 比如如下效果的界面: 2.使用ExpandableListView步骤 (1)要给ExpandableListVie ...

  8. windows向ubuntu过渡之常用编程软件安装

    不出意外的上篇文章又被踢出首页了,心情甚是悲桑..希望更多人能看到 1.安装codeblocks 直接在软件中心搜索codeblocks就可以 2.安装jdk并配置环境变量 http://www.li ...

  9. Bootstarp--全局CSS样式之表格

    表格在实际开发中可以说是非常常见的,但是有很多人不喜欢使用表格,但个人觉得在简单的界面布局中使用表格还是很简单的.毕竟人家给了表格这元素,而你却不去使用,貌似有点不解风情. 下面简单介绍Bootstr ...

  10. Session,ViewState用法

      基本理论: session值是保存在服务器内存上,那么,可以肯定,大量的使用session将导致服务器负担加重. 而viewstate由于只是将数据存入到页面隐藏控件里,不再占用服务器资源,因此, ...