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). ...
随机推荐
- nodeJS之流stream
前面的话 当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流.NodeJS中通过各种Stream来提供对数据流的操作.本文将详细说明NodeJS中的流strea ...
- 记一次调试串口设备Bug的经历
最近花了差不多1天的时间在折腾一个Bug,该Bug的表象如下: 这个Bug还特别独特,在开发电脑中无提示,在终端用户那里每次使用软件的时候都报这个.仔细思考了一下最近在源码中新添加的功能,没发现有啥特 ...
- Webpack 开发工具与模块热替换
Webpack 开发工具与模块热替换 ⚠️ 注意: 永远不要在生产环境中使用这些工具,永远不要. devtool 当 JavaScript 异常抛出时,你常会想知道这个错误发生在哪个文件的哪一行.然 ...
- 用css控制字数,多余的用省略号代替
选择器 { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100px; } white-space 属性 ...
- SQL Server 实现Split函数
添加一个表值函数. CREATE function [dbo].[fnSplit] ( ), --要分割的字符串 ) --字符串之间的分隔符 ) ,), TempName )) as begin de ...
- MAC下解决eclipse卡顿或者运行慢的问题
提示:假设你已经装了固态硬盘,并且有至少8Gb的内存.如果没有的话,带来的性能提升可能不大. 1.eclipse中加载的SDK数量过多会导致程序运行缓慢,解决方法删除plaforms下面用不到的SDK ...
- flask 扩展之 -- flask-login
一. 使用 Werkzeug 实现密码散列. generate_password_hash(password, method=pbkdf2:sha1, salt_length=8) 将原始密码作为输入 ...
- Spring定时任务实例
一.Quartz介绍 在企业应用中,我们经常会碰到时间任务调度的需求,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等.Quartz是出了名的任务调度框架,它可以与J2SE和J2EE应用程序相结合 ...
- Github站点英文翻译
1.Github首页 Pull requests Issues Gist 请求 问题 要点 ----------------------------------------------------- ...
- C++数组概述
C++数组概述 基本概念 1. 数组是固定大小的一种复合类型 因为数组是固定大小,所以在编译期间就决定了基大小 数组的内存是连续(无论是一维数组还是多维数组) 2. 数组的特性 数组之间不允许拷贝和赋 ...