面向对象设计过程中重要的一点是如何进行抽象,即把“问题空间”中的元素与“方案空间”中的元素建立理想的一对一的映射关系。抽象类和接口便是抽象过程中的产物。

    一、抽象类

我们知道,对象是通过类来产生的,但是并非所有的类都可以描述具体的对象。

如果一个类中不包含足够的信息来描述具体的对象,就成为了抽象类。抽象类是对一类有着相同特征,但细节上却有着不同表现的对象的抽象。比如,鸟类都会叫,但是不同的鸟叫法肯定是不同的,可以抽象出“叫”这个概念。

定义下面一个鸟类:

public abstract class Bird {

private String color;

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

public Bird(){

}

public abstract void sing();//鸣叫

}

//喜鹊

class  Magpie extends Bird{

public void sing() {

System.out.println("I can sing in a whisper. ");

}

}

抽象类特征:

(1)抽象类用abstract关键字修饰

(2)抽象类中的抽象方法用abstract关键字修饰,没有方法体(具体实现)。

(3)抽象类可以包含非抽象方法

(4)抽象类可以不包含抽象方法(设计成抽象类就没什么意义了吧。。。),但包含抽象方法的类一定是抽象类

(5)抽象类本质也是类,只能单继承

(6)抽象类不能实例化,不能new。我们前面说过它不描述具体的对象,肯定也不能实例化了

(7)抽象类可以有实例变量和构造方法

 

二、接口

    接口是一组方法特征的集合,是契约,规定了你可以做什么。软件设计过程中要依赖抽象,而非具体实现。

像我们电脑上的usb接口,无论你是硬盘、u盘、还是手机,只要你实现了usb规定的接口,便能够联通电脑。

上面抽象类的例子中,我想加入一个“飞”的功能,考虑到并非所有的鸟都会飞,比如:企鹅,鸵鸟,鸭子等等,该怎么办呢?

修改抽象类肯定是不合适的:1、违反开闭原则,2:会使得所有的子类都继承到“飞”这一功能,我们会看到满天的鸭子在飞了^_^。

我们可以定义下面一个接口:

public interface IFly {

void fly();

}

//喜鹊可以实现IBird中的接口:

class  Magpie extends Bird implements IFly {

public void sing() {

System.out.println("I can sing in a whisper. ");

}

public void fly(){

System.out.println("我会飞了!");

}

}

喜鹊实现了IFly中的fly接口,终于可以飞起来了。

那如果需要给鸟类增加一个游泳的功能呢?自己去想。。。

接口的特征:

(1)修饰符:public,abstract,default(不写)

(2)关键字:interface

(3)接口中的方法都是抽象方法,不可以有实现。

(4)接口中的方法默认都是public abstract的,实现类中必须使用public修饰。

(5)接口中的所有方法都必须在实现类(抽象类除外)中实现。

(6)接口中的变量默认为public static final的。

(7)一个类可以实现多个接口。

  三、应用场景

1)抽象类体现的是“is a”的关系,如果某一些类的实现有共通之处,则可以抽象出来一个抽象类,让抽象类实现共通的代码,而个性化的方法则由各个子类去实现。

2)接口体现的是“like a”的关系,表现的是不同类对象在行为上的抽象。比如飞机和鸟都会飞,可以抽离出飞的接口,但他们非同类。

3)在软件设计中,当你需要接口与实现分离,封装变化的时候,面向接口编程显得尤为重要。

比如Ioc思想,客户端不关心你具体是什么类,具体对象由容器来注入。

再比如两个系统交互,良好的设计是双方提供接口,不关心内部实现,减少耦合性的同时,封装了变化。

很多设计原则、设计思想以及设计模式都体现出面向接口编程的重要性:开闭原则,接口隔离,依赖倒置,适配器模式等等。

关注老姜谈技术,微信号:helojava,或者扫描下面二维码。


每日一帖,技术鸡汤。

java抽象类和接口的更多相关文章

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

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

  2. Java 抽象类与接口总结

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

  3. JAVA抽象类和接口的深入探讨

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

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

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

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

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

  6. java抽象类与接口区别

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

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

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

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

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

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

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

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

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

随机推荐

  1. Angularjs参考框架地址

    1.Table(Grid)参考地址 https://github.com/samu/angular-table https://github.com/daniel-nagy/md-data-table ...

  2. Flyweight(享元模式)

    import java.util.Hashtable; /** * 享元模式 * @author TMAC-J * 享元模式一般和工厂模式一起使用,但此处为了更好说明,只用享元模式 * 定义:享元模式 ...

  3. BPM合同管理解决方案分享

    一.方案概述合同是组织与组织间所订协议的法律 表现形式,体现着双方对于合作在法律和道德上的承诺.然而,大多数企业的合同管理都或多或少存在合同审批过程不规范.签订草率.审批权责不清.合同执行跟踪难.合同 ...

  4. H3 BPM让天下没有难用的流程之产品概述

    一.产品简介 BPM(Business Process Management),是指根据业务环境的变化,推进人与人之间.人与系统之间以及系统与系统之间的整合及调整的经营方法与解决方案的IT工具. H3 ...

  5. Missing Push Notification Entitlement 问题

    最近打包上传是遇到一个问题: 描述: Missing Push Notification Entitlement - Your app includes an API for Apple's Push ...

  6. join Linq

    List<Publisher> Publishers = new List<Publisher>(); Publisher publish1 = new Publisher() ...

  7. 智能头盔 "Livall携全球首款智能骑行头盔亮相CES"

    LIVALL是全球首创集音乐.通讯.智能灯光为一体的智能骑行头盔的研发者,日前Livall携旗下智能骑行头盔BH 100和BH 60参展CES 2017,这也是目前世全球首款智能骑行头盔类产品,同时亮 ...

  8. Linux学习日记-(一)

    一.为什么学习Linux 大学时开始接触Linux,最开始学习的是RedHat(小红帽),感觉Linux好像很久不见的老朋友,用起来很舒服(虽然我们用的是DotNet).很喜欢它的命令模式,让我能接触 ...

  9. 深入理解jQuery、Angular、node中的Promise

    最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...

  10. NLog在Asp.Net MVC的实战应用

    Asp.Net MVC FilterAttribute特性.读取xml反序列化.NLog实战系列文章 首先新建一个MVC project. 一.NLog的配置. 作者:Jarosław Kowalsk ...