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

    一、抽象类

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

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

定义下面一个鸟类:

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. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  2. 热修复-Tinker

    微信开源,真是喜出望外,必须要去看看啊,比起nuwa来微信好很多,而且github上也有专门的官方文档说明,还有很多资料查询 参考地址:https://github.com/Tencent/tinke ...

  3. 如何查看w3p.exe 和IIS 应用程序池的关系

    图形界面方式 命令行方式 如果找不到 appcmd Appcmd.exe exists at the location %systemroot%\system32\inetsrv\. You eith ...

  4. Java版本:识别Json字符串并分隔成Map集合

    前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...

  5. 【腾讯Bugly干货分享】动态链接库加载原理及HotFix方案介绍

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bec216d81f2415515d3e9c 作者:陈昱全 引言 随着项目中动 ...

  6. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  7. 在开发中到底要不要用var?

    var是.net的一个语法糖,在Resharper中推荐都使用这个关键字,平常我也是经常用:但是在跟其他程序员推广使用时,他的一些考虑引发了我的深思,到底该不该使用这个关键字呢? 我使用的理由 我使用 ...

  8. 如果你发现mysql的外键约束不管用了

    不知为何我机子上的mysql竟然默认关闭外键约束,导致我试了好多遍都可以插入非法值,以下语句可以开启约束 SET foreign_key_checks = 1; (0则关闭) 备忘

  9. Tomcat 8熵池阻塞变慢详解(putty)

    原因 Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom类产生安全随机类SecureRand ...

  10. node之path模块

    node之path模块 原文链接 //引用该模块 var path = require("path"); 1.路径解析,得到规范化的路径格式 对window系统,目录分隔为'', ...