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). ...
随机推荐
- python中文字符串编码问题
接口测试的时候,发现接口返回内容是uncodie类型但是包含中文.在使用print进行打印时输出提示错误: UnicodeEncodeError: 'ascii' codec can't encode ...
- 基于FPGA的均值滤波算法的实现
前面实现了基于FPGA的彩色图像转灰度处理,减小了图像的体积,但是其中还是存在许多噪声,会影响图像的边缘检测,所以这一篇就要消除这些噪声,基于灰度图像进行图像的滤波处理,为图像的边缘检测做好夯实基础. ...
- vscode中使用markdown
vscode中使用markdown vscode 是微软推出一款轻量级的文本编辑工具,类似于sublime,由于其拥有丰富的插件,安装使用也非常简单,所以深受广大程序员的喜爱. markdown 是一 ...
- 在windows下使用Qt5开发GTK3图形界面应用程序
首先,去MSYS2官网下载MSYS2环境并安装在C:/mysys64下,我安装的是64位的. 进入MSYS命令行执行: pacman -S mingw-w64-x86_64-gtk3 pacman - ...
- node.js零基础详细教程(5):express 、 路由
第五章 建议学习时间4小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
- 惊心动魄的SAP S4客户额度调整运动
今天一大早,收到商务部发来的消息,说某一个客户的额度超额了,但实际上并未超额.从SAP系统中反馈的额度来看,显示超了2万多.后来经过在BP画面检查信用段发现,这个客户额度占用里面,某一个未清订单已经部 ...
- log4j 在项目中的详细配置
1.添加log4j 包 2.首先在src目录下添加log4j.properties文件 log4j.rootLogger=debug, stdout, R log4j.appender.stdout= ...
- banner自动生成工具,ascii文字展示
前言 post@ Ryan-Miao@github.io Spring-Boot里有个banner的功能,刚开始觉得很鸡肋.然而,现在觉得蛮有意思的.无聊的程序员. 生成文字 大部分工具只支持英文的库 ...
- 阿里云OSS存储
1.accessKeyId 与 accessKeySecret 是由系统分配给用户的,称为ID对,用于标识用户,为访问OSS做签名验证. 2.Bucket是OSS上的命名空间,相当于数据的容器,可以存 ...
- 用JS来实现于截取中英文混合字符串方法(转载)
网站制作过程中,提示层文字超出,需要JS做字符串截取,但是呢,我们常常会烦恼文字中英文混合如何判断,因为我们知道在JS中 string.length这个值是不考虑中英文的,但是计算机对中英文的识别是 ...