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). ...
随机推荐
- JavaScript设计模式_03_代理模式
代理模式是非常常见的模式,比如我们使用的VPN工具,明星的经纪人,都是代理模式的例子.但是,有人会疑问,明明可以直接访问对象,为什么中间还要加一个壳呢?这也就说到了代理模式的好处.在我看来,代理模式最 ...
- java基础(二章)
java基础(二章) 一,变量 1.变量是内存中的一个标识符号,用于存储数据 2.变量命名规则 l 必须以字母.下划线 _ .美元符号 $ 开头 l 变量中,可以包括数字 l 变量中,不能出现特 ...
- Vivado2015.4使用教程(一个完成工程的建立)
双击桌面的vivado图标,(可能有点慢) 弹出主菜单界面,点击create new project 这是介绍界面,next~ 添加好工程名,和工程位置,next~ 选择rtl Project,nex ...
- iOS开发之常用资讯类App的分类展示与编辑的完整案例实现(Swift版)
上篇博客我们聊了<资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0)>,今天的这篇博客就在上篇博客的基础上做些东西.做一个完整的资讯类App中的分类展示 ...
- Android的UI调优
对于一个App的UI而言,在流畅性上的改进目标其实就是降低屏幕绘制的延迟,创建流畅和稳定的帧率以避免卡顿. 在理想情况下,全部的测量.布局和绘制的时间最好在16ms以内,这样才能保证屏幕运行的顺畅性. ...
- django 调试 监控文件变化 自动刷新浏览器
问题描述:修改html js py等文件后,自动刷新浏览器,解放F5,提高效率 解决办法:使用gulp,使用bowerSync 关于gulp,可以查看系列教程 关于bowerSync,查看官网 关于结 ...
- elasticSearch(5.3.0)的评分机制的研究
1. ElasticSearch的评分 在用ElasticSearch作为搜索引擎的时候,如果采用关键字进行查询,ElasticSearch会对每个符合查询条件的文档进行评分,在5.3.0的版本中, ...
- vue 基础-->进阶 教程(1): 基础(数据绑定)
第一章 建议学习时间4小时 课程共3章 前面的nodejs教程并没有停止更新,因为node项目需要用vue来实现界面部分,所以先插入一个vue教程,以免不会的同学不能很好的完成项目. 本教程,将从零 ...
- Linux 下开启ssh服务
在虚拟机里安装完后,想往虚拟机里拷贝软件 当使用Xmanager ftp连接时候 出现 连接不上的问题,其解决方案如下: 1.修改sshd_config文件,命令为:vim /etc/ssh/sshd ...
- PHP数组按引用传递
<?php /**PHP数组按引用传递**/ $arr = array( array('id' => 1, 'name' => 'name1'), array('id' => ...