在面向对象的概念中,我们知道所有的对象都是通过类来描述的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

  抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称为抽象。

  比如:我们要描述“水果”,它就是一个抽象,它有质量、体积等一些共性,但又缺乏特性(苹果、橘子都是水果,它们有自己的特性),我们拿不出唯一一种能代表水果的东西(因为水果、橘子都不能代表水果),可用抽象类来描述它,所以抽象类是不能够实例化的。当我们用某个类来具体描述“苹果”时,这个类就可以继承描述“水果”的抽象类,我们都知道“苹果”是一种“水果”。

  接口和抽象类中的所有抽象方法不能有具体实现,而应在它们的子类中实现所有的抽象方法(要有函数体,哪怕{}里为空),Java的设计者可能为抽象方法的灵活性考虑,每个子类可根据自己的需要来实现抽象方法。

抽象类(abstract class)的定义方式如下:

    public abstract class AbstractClass{
public int t;//普通数据成员
public abstract void method1();//抽象方法,抽象类的子类在类中必须实现抽象类中的抽象方法
public abstract void method2();
public void method3();//非抽象方法
public int method4();
public int method4(){
//抽象类中可以赋予非抽象方法的默认行为,即方法的具体实现
}
public void method3(){
//抽象类中可以赋予非抽象方法的默认行为,即方法的具体实现
}
}
    接口(interface)的定义方式如下:
    public interface Interface{
static final int i;//接口中不能有普通数据成员,只能够有静态下的不能被修改的数据成员,static表示全局,final表示不能被修改,可以不用static final修饰,会隐式的声明为static和final
public void method1();//接口中的方法一定是抽象方法,所以不用abstract修饰
public void method2();//接口中不能赋予方法的默认行为,即不能有方法的具体实现
}

  简而言之,抽象类是一个功能不全的类,接口只是一个抽象方法声明和静态不能被修改的数据的集合,两者都不能被实例化。

  从某种意义上说,接口是一种特殊形式的抽象类,在Java语言中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。在许多情况下,接口确实可以代替抽象类,如果你不需要刻意表达属性上的继承的话。

  进一步理解,关于Java引入抽象类,接口的目的,向高手请教的答复如下:

  1.从类的层次结构上看,抽象类是在层次的顶端,但在实际的设计当中,一般来说抽象类应当是后面才出现。为什么?实际上抽象类的获取有点像数学中的提取公因式:ax+bx,x就是抽象类,如果你没有前面的式子,你怎么知道x是不是公因式呢?在这点上,也符号人们认识世界的过程,先具体后抽象。因此在设计过程中如果你看到大量的具体概念并从当中找到其共性时,这个共性的集合就是抽象类应当是没错的。

  2.interface从表面上看,和抽象类很类似,但用法完全不同,它的基本功能就是把一些毫不相关的类(概念)集合在一起形成一个新的、可集中操作的“新类”。一个典型的例子就是“司机”。谁可以当司机?谁都可以,只要领取了驾照。所以我不管你是学生,白领,蓝领还是老板,只要有驾照就是司机。

    interface DriverLicence{
License getLicence();
}
class StudentDriver extends Students implements DriverLicence{
}
class WhileCollarEmploeeDriver extends WhileCollarEmployee implements DriverLicence{
}
class BlueCollarEmployeeDiver extends BlueCollarEmployee implements DriverLicence{
}
class BossDriver extends Boss implements Driver{
}
当我定义了“汽车”类后,我就可以指定“司机”了。
class Car{
setDriver(DriverLicence driver);
}

  这时候,Car的对象并不关心这个司机到底是干什么的,他们唯一共同的就是领取了驾照(都实现了DriverLicense接口)。这个,应当是接口最强大的地方也是抽象类无法比拟的。

  总结:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。通常我们平时养成良好的习惯就是多用接口,毕竟Java是单继承,不像C++,但是在需要使用抽象类的时候一定还是要用的(有点类似goto的用法)。

转自:http://www.cnblogs.com/xiaoao808/archive/2008/03/11/1100886.html

Java中的接口和抽象类(转)的更多相关文章

  1. Java中的接口与抽象类的区别

    由于随着jdk版本的更新,在jdk1.8时,接口也增强了,所以我们分别来说明一下. (1)jdk1.8之前 在jdk1.8之前,接口里面只能定义抽象方法和常量:而抽象类比普通类有一点不同,就是抽象类里 ...

  2. 【转载】JAVA中综合接口和抽象类实现的一种“抽象接口”

    Muscleape个人总结:(这里的抽象接口是指:使用一个抽象类实现一个接口,是两部分结构) 使用一个抽象类直接实现接口,将接口中的方法区分为实现类必须要实现的和选择性实现的,其他需要实现接口的类型通 ...

  3. Java中的接口和抽象类

    接口和抽象类是Java设计中最基本的概念,它们都不能实例化对象,都可以实现多态,也都能用来创建匿名内部类.但实际使用上还有很多的不同. 两者的语法定义不同,对应的设计抽象关系也不同,接口主要是对行为的 ...

  4. Java中:接口,抽象类,内部类

    Java8中的接口 public interface Output { //接口里定义的成员变量只能是常量 //默认使用public static final修饰 int MAX_CACHE_LINE ...

  5. java中的接口和抽象类的区别

    1.接口从用户的角度(使用实现的代码)看问题. 2.接口由编译器强制的一个模块间协作的合约. 3.无成员变量. 4.成员函数只能声明不能实现,(jdk1.8中的default 方法可以有方法体). 接 ...

  6. java中的接口和抽象类是什么?

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

  7. Java中的接口与抽象类

    抽象类很简单,就是多了个abstract关键字,可以有(也可以没有)只声明不定义的方法.不能实例化该类. 接口比较特殊: 无论你加不加public,接口中声明的方法都是public的,还有无论你加不加 ...

  8. 【Java基础】接口和抽象类之间的对比

    Java 中的接口和抽象类之间的对比 一.接口 Interface,将其翻译成插座可能就更好理解了.我们通常利用接口来定义实现类的行为,当你将插座上连接笔记本的三角插头拔掉,换成微波炉插上去的时候,你 ...

  9. 第五节:详细讲解Java中的接口与继承

    前言 大家好,给大家带来详细讲解Java中的接口与继承的概述,希望你们喜欢 什么是接口(interface) 接口中的方法都是抽象方法,public权限,全是抽象函数,不能生成对象 interface ...

随机推荐

  1. arcgis js 几种拓扑关系详解

    arcgis js的拓扑关系,在处理复杂逻辑和分析时,可以通过拓扑关系,减小客户端的工作量 拓扑关系: 1.overlaps 重叠 这里的重叠跟平时我们理解的不太一样,这里的重叠,必须是A与B有交集, ...

  2. Unity3D C# 学习List数据类型的使用

    List<T>类是ArrayList 类的泛型等效类. 该类使用大小可按需动态增加的数组实现 泛型的好处: 它为使用 c#语言编写面向对象程序增加了极大的效力和灵活性.不会强行对值类型进行 ...

  3. java网络访问指定出口ip

    java网络访问指定出口ip Table of Contents 1. socket 2. apache httpclient 1 socket 可以在Socket构造函数中指定使用的本地ip,如: ...

  4. hibernate课程 初探单表映射3-4 组件属性

    本节内容: 1 简介组件属性 2 demo 1 简介组件属性: <component name = "address" class = "Address" ...

  5. 学习《CSS选择器Level-4》不完全版

    1 概述 1.1 前言 选择器是CSS的核心组件.本文依据W3C的Selectors Level 4规范,概括总结了Level1-Level4中绝大多数的选择器,并做了简单的语法说明及示例演示.希望对 ...

  6. HDU 2955 Robberies抢劫案(01背包,变形)

    题意:要抢劫,但是抢每个银行都有被抓的概率,问在低于规定的被抓概率情况下最多能抢到多少钱. 输入:第一行为T,表示共T个测试例子.每个例子的第一行给出一个浮点数P,是规定被抓的概率上限.第一行还有一个 ...

  7. LeetCode Length of Last Word 最后一个字的长度

    class Solution { public: int lengthOfLastWord(const char *s) { ; string snew=s; ,len=strlen(s); ]; ) ...

  8. linux 命令——54 ping(转)

    Linux系统的ping 命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地 址192.168.1.1试试 ...

  9. Python常见编程规范总结

    Pythonic定义 Python最常用的编码风格还是PEP8,详见:http://jython.cn/dev/peps/pep-0008/ Pythonic确实很难定义,先简单引用下<Pyth ...

  10. 倍增LCA

    前言 在做树上问题时,我们经常会遇到 \(LCA\)(最近公共祖先)问题.曾经的我遇到这类问题只会\(O(n)\)暴力求解,学了倍增\(LCA\),就可以\(O(logn)\)解决了. 简介 倍增\( ...