对于面向对象编程,抽象是它的三大特征(抽象、继承、多态)之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。

  这两者既相似又存异。诸位在初学的时候也会傻傻分不清接口与抽象类的区别,大多数都在随意使用,实则不然。

一、抽象类
  使用abstract关键字声明的类就是抽象类。此处与含有抽象方法的类是抽象类的概念并不冲突,抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。如含有抽象方法的抽象类声明如下:

public abstract class HelloAbstractor {

    abstract void sayHi();

}

  抽象类必须在类前用abstract关键字修饰,抽象方法亦同。因为抽象,所以不能用抽象类实例化。

  在《JAVA编程思想》一书中,将抽象类定义为“包含抽象方法的类”,这种说法是不正确的,起码是不负责任的。我们可以随意声明一个不含抽象方法的抽象类,如下:

public abstract class HelloAbstractor {

    // abstract void sayHi();

    public void sayHi() {
System.out.println("Hello World!");
} }

  

  上面的抽象类声明完全没有问题,或许有人想到这样做有什么用处,完全没有意义。恕我不能苟同这些想法的人,对于愚昧、无知且无畏的人,只想说愚蠢。

言归正传:

package com.charles.common.utils;

public abstract class CommonUtils {

    public static void main(String[] args) {

        String name = "Charles";
sayHello(name);
} public static void sayHello(String name) {
System.out.println("Hello " + name);
} }

  对于上面这份声明,除去上面的abstract关键字,相信很多人都熟悉,在这里、我用上面的代码解释了为什么一个类没有定义抽象方法却要声明为一个抽象类,其(此处)目的就是对于一个不需要实例化的类,就可以声明为抽象的,例如我们经常定义的工具类、常量类等。  

  抽象类和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

  1)抽象方法必须为public、protected之一,否则编译不过去,缺省情况下默认为public。

    解释:抽象方法声明为private,则不能被子类继承,子类便无法实现该方法

  2)抽象类不能用来创建对象;

    解释:只是因为抽象

  3)一个类继承了某抽象类,如果父类含有抽象方法,则子类必须实现父类的抽象方法;否则子类必须声明为抽象类。

在其他方面,抽象类和普通的类并没有区别。

二.接口
  接口既interface,在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。在Java中,定一个接口的形式如下:

package com.charles.spring.service;

public interface TimerTask {

    void doTimerTask() throws Exception;

}

  

  接口中可以含有变量和方法,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

  接口实现:

package com.charles.spring.service.impl;

import com.charles.spring.service.TimerTask;

public class TimerTaskImpl implements TimerTask {

    @Override
public void doTimerTask() throws Exception {
System.out.println("Hello Timer");
} }

  可以看出,允许一个类遵循特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。

package com.charles.common.utils;

import com.charles.spring.service.TimerTask;

public abstract class AbstractTimerTask implements TimerTask {

    @Override
public abstract void doTimerTask() throws Exception ; }

三.抽象类和接口的区别

1.语法层面上的区别

  1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

  2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

  3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

  4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

2.设计层面上的区别

  1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为;而接口却是对类局部或行为进行抽象。

  2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计,接口是一种行为规范,它是一种辐射式设计。简言之、模板设计就是修改了模板/抽象类,子类自动含有相关的修改;辐射式设计就是修改了接口,实现其的子类都需要作出修改。

Java 接口-抽象类解析的更多相关文章

  1. Java接口,抽象类

    1.接口(interface),接口被用来建立类与类之间关联的标准. 2.抽象类(abstract class),只要类中有一个抽象方法,此类就被标记为抽象类.实际上抽象类除了被继承之外没有任何意义. ...

  2. Java接口抽象类

    抽象类中的方法可以实现,接口中的方法只能声明,不能实现.抽象类的成员变量可以为各种类型,接口的变量只能为public static final.抽象类可以有静态方法和静态代码块,接口不能有.一个类只能 ...

  3. Java 接口 抽象类 抽象方法

    abstract class elehousekeeping { //抽象家用电器类 abstract void opermode(); //抽象方法} class TV extends elehou ...

  4. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  5. 转载:详细解析Java中抽象类和接口的区别

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

  6. Java 的抽象特性:抽象类与接口深度解析

    要点: 抽象类 接口 抽象类与接口的差别 一. 抽象 对于面向对象编程来说,抽象是它的四大特征之中的一个. 在Java中,能够通过两种形式来体现OOP的抽象:接口和抽象类. 接口和抽象类为我们提供了一 ...

  7. 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)

    JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM, ...

  8. java 接口和抽象类的区别

    java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...

  9. java接口和抽象类

    关于接口 1.创建一个接口,需要使用interface关键字. 2.实现一个接口,需要使用implements关键字. 3.接口的成员属性都是静态常量(默认public static final). ...

随机推荐

  1. 黑马程序员:轻松精通Java学习路线连载1-基础篇!

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  2. android 定时器(Handler Timer Thread AlarmManager CountDownTimer)

    Android实现定时任务一般会使用以上(Handler Timer Thread AlarmManager CountDownTimer)五种方式.当然还有很多组合使用(比如Handler+Thre ...

  3. 反射型XSS的逆袭之路

    0×00背景 这是一次结合各自技巧的渗透过程,由于原作者的截图不多,我们只是简单叙述一下思路~ 目标是一家本地的游戏公司,起因是找到一个反射型xss,但是却被对方公司忽略,而作者身边的一个妹子也在这家 ...

  4. PO/VO/POJO/BO/VO图解

  5. 不再迷惑,无值和NULL值的转换

    在关系型数据库的世界中,无值和NULL值的区别是什么?一直被这个问题困扰着,甚至在写TSQL脚本时,心有戚戚焉,害怕因为自己的一知半解,挖了坑,贻害后来人,于是,本着上下求索,不达通幽不罢休的决心(开 ...

  6. Linux命令 查看及修改文件属性

    chmod [功能说明] 改变文件的访问权限  #Linux中访问权限分为:文件属主(文件的创建者)文件组属主(创建者所处的组)和其他(其他用户) [语法格式] Chmod[参数]mode[文件名或目 ...

  7. jq瀑布流代码

    <style> #zh{ position:fixed; width:100%; height:100%; background:url(images/bgblack.png); top: ...

  8. Python操作redis系列之 列表(list) (四)

    # -*- coding: utf- -*- import redis r =redis.Redis(host=,password="ZBHRwlb1608") 1. Lpush ...

  9. 【翻译Autofac的帮助文档】1.入门指南

    [写在前面]尝试做完一件工作之外自我觉得有意义的一件事,那就从翻译Autofac的帮助文档吧. 入门指南 将Autofac集成你的应用程序的步骤通常很简单,一般是: 时刻以IOC(控制反转)的思想来规 ...

  10. Winform Timer用法,Invoke在Timer的事件中更新控件状态

    System.Timers.Timer可以定时执行方法,在指定的时间间隔之后执行事件. form窗体上放一个菜单,用于开始或者结束定时器Timer. 一个文本框,显示定时执行方法. public pa ...