Java抽象类和接口的区别及联系
抽象类
注:先将抽象类中的两种方法解释完,再综合解释抽象类
抽象方法
- 应用场景:其下所有子类都应该有该方法但是大部分子类具体的执行步骤是有所不同的。
- 必须重写:也可以说“必须实现”,因为父类的抽象方法没有方法体。
- 关键字:abstract
普通方法
- 应用场景:其下所有子类都应该有该方法而且大部分子类具体的执行步骤是完全相同。
- 可重写:普通方法是可以重写的,对于每一个子类执行步骤都是相同的自然没有必要去重写;绝大部分子类执行步骤相同的情况就要在那一小部分不同的子类中去重写。
- 选择依据:见应用场景
抽象类详解
- 定义:其中有抽象方法的类都必须定义为抽象类。
- 存在意义:实现程序的多态性。(必须被继承,否则它的存在是没有意义的)
问题:既然普通方法可以被重写,那么子类中有不同执行步骤我再重写就好了为什么我还需要抽象方法呢?
答:抽象方法是必须被重写且父类中没有方法体,而普通方法不是必须被重写而且父类中有方法体;这样就造成一个问题:程序过大而不使用这种方法,父类中普通方法太多,子类都要记得去重写,但是java虚拟机又不会告诉你去重写,不重写子类就按照父类默认的方法体执行了;而抽象方法就不同了,子类不重写java虚拟机报错,这时候就起到了提醒以及强制的作用。
接口
- 定义:接口的存在是为了实现程序的可扩展性。
- 存在意义:如果你的类的结构体系中,某一个类要扩充功能怎么办?那么我们就要去修改这个类的父类甚至说是超类吗?这显然不合理。(而且如果你使用别人提供的类,根本就不可能去修改它)也许你要一直追溯到Object都不行。可是使用接口,你想给这个体系中的某个类扩充功能,只需要给这个类实现一个新的接口,自然就会提供新的功能,丝毫不会影响它的超类, 而它的子类自动也扩充了它新增加的这个接口的方法(有点象C++多继承)。这使的软件的功能扩展变得更容易。设计模式中有一条开闭原则,说:软件实体必须都修改关闭,对扩展开放。 使用接口,就可以满足这样的设计要求。
- 应用场景:该类下某些子类需要该方法而有一些则不需要,那么就在需要的子类下接入接口即可。
问题:既然接口是某一子类特有的,那么为什么我们不在该子类下直接定义普通方法呢?
答:这是没有大程序编写经验的常见问题。所谓的接口,就是使用的人不知道你的子类是什么,而调用你的子类。这个时候别人怎么知道你的子类有什么方法呢?于是你告诉他,我的子类是继承了某个接口的,别人一看,哦,这个接口里有方法a、b、c,这样就可以调用了。你说为啥不直接告诉他你的子类呢,这个就是复用性了。一个接口,你可以用多个子类去实现它,别人只要调用一个接口,通过换子类,就能在不改代码的情况下使用多种功能。当然,子类自然去实现这些方法也行啊,但如果你做了一个父类,人家不明白你的意思,继承你的父类, 忘记了写要实现的方法怎么办?接口起到了强制性的措施。
注:抽象类和接口共同支持了程序的可维护性。
区别以及联系
区别
- 抽象类中可以有构造方法,接口中没有。
- 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
- 抽象类中可以有普通成员变量,接口中没有普通成员变量。
- 抽象类中可以包含静态方法,接口中不能包含静态方法。
- 抽象类中的抽象方法的访问类型可以是 public,protected ,但接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
- 一个类可以实现多个接口,但只能继承一个抽象类。
- 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只是public static final 类型,并且默认即为 public static final 类型。
联系
- 都提高了代码的复用性。
- 都提高了代码的可维护性以及可扩展性。
- 都体现了面向对象编程的多态性。
- 接口是一个特殊的抽象类。
本质区别
抽象类是对事物本质的抽象,而接口是对某几种行为的耦合手段。
通过实例理解
首先我们梳理一下类之间的关系(标注了*了的为抽象类)
- Student*(学生)
- Studystudent*(学习类)
- Libstudent(文科生)
- Sciencestudent(理科生)
- Longhairstudent*(艺术类)
- Artstudent(美术生)
- Musicstudent(音乐生)
- Studystudent*(学习类)
然后梳理各种学生的行为特征(标注了*的为抽象方法,标注了#的为接口)
- Student的特征:起床,吃饭,学习*,睡觉
- Studystudent新加的特征:考试*
- Libstudent新加的特征:多做语文#
- Sciencestudent新加的特征:多做数学#
- Longhairstudent新加的特征:技能训练*
- Studystudent新加的特征:考试*
接下来上代码
//Student
public abstract class Student {
public void getup() {//起床,所有学生都要做且步骤相同
System.out.println("起床");
}
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
abstract public void study();
}
//Studystudent
public abstract class Studystudent extends Student {
abstract public void exam();
}
//Longhairstudent
public abstract class Longhairstudent extends Student {
abstract public void skilltrain();
}
//Libstudent
public class Libtstudent extends Studystudent implements Morechinese{
@Override
public void dochinese() {
System.out.println("多做语文");
}
@Override
public void exam() {
System.out.println("考试政史地");
}
@Override
public void study() {
System.out.println("学习政史地");
}
}
//Sciencestudent
public class Libtstudent extends Studystudent implements Morechinese{
@Override
public void dochinese() {
System.out.println("多做语文");
}
@Override
public void exam() {
System.out.println("考试理化生");
}
@Override
public void study() {
System.out.println("学习理化生");
}
}
//Artstudent
public class Artstudent extends Longhairstudent{
@Override
public void skilltrain() {
System.out.println("美术技能训练");
}
@Override
public void study() {
System.out.println("学习画画基本功");
}
}
//Musicstudent
public class Musicstudent extends Longhairstudent{
@Override
public void skilltrain() {
System.out.println("唱歌技能训练");
}
@Override
public void study() {
System.out.println("学习唱歌基本功");
}
}
//主类
public class Demo {
public static void Oneday(Student cuteStudent) {
cuteStudent.getup();
cuteStudent.eat();
cuteStudent.study();
cuteStudent.sleep();
}
public static void main(String[] args) {
Oneday(new Artstudent());
}
}
我们在主类中定义了一个方法体(Oneday),用来查看一个学生的一天大体的活动。该方法的形参是Student的引用,那么我们只需要在用这个方法的时候改变实例化即可得到不同类型学生的一天。
执行结果如下图:

如果改成new Libstudents,执行结果如下图:

那么我们定义了接口该如何使用呢?在主类中加入如下代码:
Moremath iMoremath=new Sciencestudent();
iMoremath.domath();
或者;
new Sciencestudent().domath();
执行后会显示“多做数学”。
Java抽象类和接口的区别及联系的更多相关文章
- java抽象类与接口的区别及用法
java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...
- 第十八节:详解Java抽象类和接口的区别
前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...
- Java抽象类和接口的区别(好长时间没看这种文章了)
Java抽象类和接口的区别(好长时间没看这种文章了) abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的 ...
- java 抽象类与接口的区别 整理
抽象类与接口的区别 抽象类 包含抽象方法的类就是抽象类,声明的语句:abstract class 必须是public protected 接口 对行为的抽象,声明语句:interface 抽象方法的修 ...
- java抽象类和接口的区别(转载)
1.Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用. 如果向一个抽象类里加入 ...
- Java抽象类与接口的区别
很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. ...
- java 抽象类与接口的区别
在Java 语言中, abstract class 和interface 是支持抽象类 定义的两种机制.正是由于这两种机制的存在,才赋予 了Java强大的 面向对象能力.abstract class和 ...
- XML文档形式&JAVA抽象类和接口的区别&拦截器过滤器区别
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? a: 两种形式 dtd schemab: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发 ...
- 【转】Java抽象类与接口的区别
很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. ...
随机推荐
- 【React.js小书】动手实现 React-redux(五):Provider - 方志
我们要把 context 相关的代码从所有业务组件中清除出去,现在的代码里面还有一个地方是被污染的.那就是 src/index.js 里面的 Index: 1234567891011121314151 ...
- (转)python中join()方法
原文:http://blog.csdn.net/weixin_40475396/article/details/78227747 函数:string.join() Python中有join()和os. ...
- 在中国实现自我价值的英国研究员——微软亚洲研究院英国籍研究员Darren的7年之路
"我和妻子在这儿已经待了7年了,这里的一切都很棒,无论是微软亚洲研究院还是北京."Darren笑着说,似乎他和中国,和北京,和研究院一直停留在"蜜月期",并未曾 ...
- 将本地的一个项目托管到自己的GitHub仓库
GitHub作为全球最大的代码托管平台,功能十分强大.我们可以在上面建立一个仓库来托管我们的代码图片等资源.因为使用markdown语法来写博客所以在插入图片时需要一个图片外链地址,起初去网上找了一个 ...
- Luogu_2876_[USACO07JAN]解决问题Problem Solving
题目描述 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地说,他们有\(P(1 \leq P \leq 300)\)道题目要做. 他们还离开了农场并且象普通人一 ...
- SpringMVC之reset风格和form表单格式的curd
CRUD c:create创建 r:retieve:查询 u:update:修改 d:delete:删除 rest /emp/1 get 代表查询id为1的员工 /emp/1 put 代表修改id为1 ...
- Linux命令alias - 设置命令的别名
用途说明设置命令的别名.在linux系统中如果命令太长又不符合用户的习惯,那么我们可以为它指定一个别名.虽然可以为命令建立“链接”解决长文件名的问题,但对于带命令行参数的命令,链接就无能为力了.而指定 ...
- 工业界 vs. 学术界: 一个年轻员工的视角
本文发表于<中国计算机学会通讯>2015年第5期,转载已获得授权 作者:菲利普·郭 (Philip Guo),美国罗切斯特大学助理教授 译者:王长虎,微软亚洲研究院主管研究员 如果你即将 ...
- 安卓之父造手机:该紧张的只有iPhone?
近日,"安卓之父" Andy Rubin正式带来他潜心打造的新款智能手机--Essential.这款设计新颖.配置强大的手机刚一发布,就引起全球科技界的广泛关注.对iPhone.三 ...
- web系统是否要前后端分离?
开发一个web管理系统,是否要采用如今流行的前后端分离模式? 首先要从为什么会出现前后端分离说起,前后端分离的目的. 1.让前端工程师(前端)和后端工程师(后端)们能够更加专注于自己的领域 传统的开发 ...