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

    一、抽象类

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

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

定义下面一个鸟类:

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. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  2. PHP好用但又容易忽略的小知识

    1.PHP函数之判断函数是否存在 当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists判断一下函数是否存在.同样的method_ ...

  3. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  4. 利用注册表在右键添加VS15的快捷方式打开文件夹

    1.简介 最近安装VS15 Preview 5,本版本可以打开"文件夹" 是否可以向Visual Studio Code一样在文件夹或文件右键菜单添加"Open with ...

  5. Response.Redirect引起的性能问题分析

    现象: 最近做的一个系统通过单点登录(SSO) 技术验证用户登录.用户在SSO 系统上通过验证后,跳转到该系统的不同模块.而跳转的时间一直维持子啊几分钟左右. 分析步骤: 在问题复现时抓取Hang d ...

  6. c#比较两个数组的差异

    将DataTable中某一列数据直接转换成数组进行比较,使用的Linq,要引用命名空间using System.Linq; string[] arrRate = dtRate.AsEnumerable ...

  7. Div Vertical Menu ver5

    这个小功能,如果是算此次,已经是第5次修改了.可以从这里看到前4次:V1, http://www.cnblogs.com/insus/archive/2011/10/17/2215637.html V ...

  8. Android Studio切换为eclipse的快捷键之后还是有区别的部分快捷键

    Android Studio Eclipse 把代码提示换成了Class Name Completion, 快捷键是Ctrl+Alt+Space(空格键). 代码提示快捷键Alt+/,         ...

  9. Hadoop伪分布式集群环境搭建

    本教程讲述在单机环境下搭建Hadoop伪分布式集群环境,帮助初学者方便学习Hadoop相关知识. 首先安装Hadoop之前需要准备安装环境. 安装Centos6.5(64位).(操作系统再次不做过多描 ...

  10. mono ios莫名其妙闪退的解决方法

    使用mono进行ios开发也有一年了,一直有个头疼的问题是闪退,而且闪退的时候并没有抛出明确的错误. 前两天在调试一个bug的时候,在序列化的时候又莫名其妙的闪退,后来在一位大神(博客地址)的指导下, ...