Java 接口-抽象类解析
对于面向对象编程,抽象是它的三大特征(抽象、继承、多态)之一。在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 接口-抽象类解析的更多相关文章
- Java接口,抽象类
1.接口(interface),接口被用来建立类与类之间关联的标准. 2.抽象类(abstract class),只要类中有一个抽象方法,此类就被标记为抽象类.实际上抽象类除了被继承之外没有任何意义. ...
- Java接口抽象类
抽象类中的方法可以实现,接口中的方法只能声明,不能实现.抽象类的成员变量可以为各种类型,接口的变量只能为public static final.抽象类可以有静态方法和静态代码块,接口不能有.一个类只能 ...
- Java 接口 抽象类 抽象方法
abstract class elehousekeeping { //抽象家用电器类 abstract void opermode(); //抽象方法} class TV extends elehou ...
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
- 转载:详细解析Java中抽象类和接口的区别
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...
- Java 的抽象特性:抽象类与接口深度解析
要点: 抽象类 接口 抽象类与接口的差别 一. 抽象 对于面向对象编程来说,抽象是它的四大特征之中的一个. 在Java中,能够通过两种形式来体现OOP的抽象:接口和抽象类. 接口和抽象类为我们提供了一 ...
- 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)
JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM, ...
- java 接口和抽象类的区别
java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...
- java接口和抽象类
关于接口 1.创建一个接口,需要使用interface关键字. 2.实现一个接口,需要使用implements关键字. 3.接口的成员属性都是静态常量(默认public static final). ...
随机推荐
- 事件总线(Event Bus)知多少
源码路径:Github-EventBus 简书同步链接 1. 引言 事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉.事件总线是对发布-订阅模式的一种实现.它是一种集 ...
- lftp的用法
lftp是Linux下的一个ftp工具,支持ftp, ftps, http, https, hftp, fish, sftp, file, bittorrent等协议(支持https 和 ftps,必 ...
- 使用 bufferedreader 的好处
简单的说,一次IO操作,读取一个字节也是读取,读取8k个字节也是读取,两者花费时间相差不多.而一次IO的来回操作却要耗费大量时间.好比是一辆大型汽车(设装100人),要去车站接人到公司,接一个人也是接 ...
- 东北育才 DAY2组合数取mod (comb)
组合数取模(comb) [问题描述] 计算C(m,n)mod 9901的值 [输入格式] 从文件comb.in中输入数据. 输入的第一行包含两个整数,m和n [输出格式] 输出到文件comb.out中 ...
- Akka(9): 分布式运算:Remoting-远程构建式
上篇我们讨论了Akka-Remoting.我们说Akka-Remoting是一种点对点的通讯方式,能使两个不同JVM上Akka-ActorSystem上的两个Actor之间可以相互沟通.Akka-Re ...
- java 父类构造器
当创建任何java对象时,程序总会首先调用系统的父类非静态初始化块(隐式执行)和父类构造器(从object开始(java程序中所有类的最终父类都是java.lang.Object类,使用语句super ...
- 使用zabbix_agent监控第一台windows服务器
解压windows客户端压缩包 bin目录下会有win32和win64俩个文件夹,根据windows系统的版本自行进行选择,将客户端程序文件拷贝至C:\zabbix 将conf文件中的zabbix_a ...
- maven打包 tomcat运行pom配置 或 打成jar包
maven打包 tomcat运行pom配置,同时还需要配置org.apache.tomcat.maven插件,这里省略. <groupId>com.company</groupId& ...
- 【Python3之异常处理】
一.错误和异常 1.错误 代码运行前的语法或者逻辑错误 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^ SyntaxError: inva ...
- WPF编程-WPF体系结构
WPF简介 Windows Presentation Foundation(WPF)是微软新一代图形系统,运行在.NET Framework 3.0架构下,为用户界面.2D/3D 图形.文档和媒体提供 ...