抽象类

注:先将抽象类中的两种方法解释完,再综合解释抽象类

抽象方法

  • 应用场景:其下所有子类都应该有该方法但是大部分子类具体的执行步骤是有所不同的。
  • 必须重写:也可以说“必须实现”,因为父类的抽象方法没有方法体。
  • 关键字: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(音乐生)

然后梳理各种学生的行为特征(标注了*的为抽象方法,标注了#的为接口)

  • Student的特征:起床,吃饭,学习*,睡觉

    • Studystudent新加的特征:考试*

      • Libstudent新加的特征:多做语文#
      • Sciencestudent新加的特征:多做数学#
    • Longhairstudent新加的特征:技能训练*

接下来上代码

//Studentpublic 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();
}
//Studystudentpublic abstract class Studystudent extends Student {abstract public void exam();
}
//Longhairstudentpublic abstract class Longhairstudent extends Student {abstract public void skilltrain();
}
//Libstudentpublic class Libtstudent extends Studystudent implements Morechinese{@Overridepublic void dochinese() {System.out.println("多做语文");}@Overridepublic void exam() { System.out.println("考试政史地");}@Overridepublic void study() {System.out.println("学习政史地");}}
//Sciencestudentpublic class Libtstudent extends Studystudent implements Morechinese{@Overridepublic void dochinese() {System.out.println("多做语文");}@Overridepublic void exam() { System.out.println("考试理化生");}@Overridepublic void study() {System.out.println("学习理化生");}}
//Artstudentpublic class Artstudent extends Longhairstudent{@Overridepublic void skilltrain() {System.out.println("美术技能训练");}@Overridepublic void study() {System.out.println("学习画画基本功");}}
//Musicstudentpublic class Musicstudent extends Longhairstudent{@Overridepublic void skilltrain() {System.out.println("唱歌技能训练");}@Overridepublic 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抽象类和接口的区别和联系相关推荐

  1. java接口vm和dto的区别_第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  2. jdk1.8中,java 抽象类和接口的区别

    抽象类 特点: 1.抽象类中可以构造方法 2.抽象类中可以存在普通属性,方法,静态属性和方法. 3.抽象类中可以存在抽象方法. 4.如果一个类中有一个抽象方法,那么当前类一定是抽象类:抽象类中不一定有 ...

  3. java 抽象类与接口的区别及其在jdk中的应用

    什么是抽象类 一般而言含有抽象方法的类是抽象类,那什么是抽象方法? 就是只有方法名,没有方法体. 但是,要是没有抽象方法,你写个abstract class xx{} 这个也是抽象类~ 那么没有抽象方 ...

  4. Java 抽象类和接口的区别

    抽象类和接口的区别 1.抽象类是半抽象的,接口是完全抽象的 2.抽象类中没有构造方法,接口有构造方法 3. 类和类之间只能单继承,接口和接口之间可以多继承 4. 一个类可以同时实现多个接口,一个抽象类 ...

  5. java—抽象类与接口的区别

    抽象类与接口的区别 | 抽象类 接口 结构组成 普通类+抽象方法 全局常量+抽象方法 权限 任何权限 只能使用public 子类使用 使用extends关键字继承抽象类 使用implements关键字 ...

  6. JAVA抽象类和接口的区别【附经典分析用例Door】

    这篇文章对抽象类和接口说的很详细,希望对大家有所帮助. abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大 ...

  7. Java抽象类与接口的区别

    很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. ...

  8. 【转】Java抽象类与接口的区别

    很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. ...

  9. 转载 java抽象类与接口的区别

    Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和inte ...

最新文章

  1. 百度CTO王海峰博鳌解读AI“融合创新”,算力算法数据发挥综合作用
  2. ECCV2020 | Gen-LaneNet:百度Apollo提出两阶段的3D车道线检测算法,已开源
  3. Oracle DB 服务器 系统时间修改问题 与 SCN 关系的深入研究
  4. 四川大学计算机学院录取,四川大学计算机学院2018年硕士研究生招生拟录取名单及成绩公示...
  5. 积累一点小Sql 表的纵横互转玩玩看
  6. 如何使用SAP Cloud for Customer里的ABSL代码调用Web service
  7. mysql 轨迹数据存储_基于Tablestore实现海量运动轨迹数据存储-阿里云开发者社区...
  8. LSGO软件技术团队对外技术交流
  9. 飞鸽传书2007 一个自己开发的软件
  10. 【Java数据结构与算法】第十七章 二分查找(非递归)和分治算法(汉诺塔)
  11. C++ 引用的几个用法
  12. 深掘工业互联网大数据五大维度
  13. 深入学习MyBatis中的参数
  14. putty连接linux设置文件夹,【整理】Windows用ssh连接Linux,想要从Linux上面上传/下载文件 - putty的子工具psftp...
  15. 游戏开发中常见的10种编程语言
  16. “汇新杯”新兴科技+互联网创新大赛正式启动
  17. Cadence Allegro如何设置差分对
  18. Unity跑酷游戏中的路点生成算法
  19. java 51nod
  20. 快速对帝国竞争算法ICA的了解

热门文章

  1. unity导出面板详解(pc版)
  2. Debezium系列之:重置Sqlserver数据库的LSN拉取历史数据
  3. 第八届蓝桥杯 - 原题 + 题解
  4. 吉林银行采用ManageEngine保障数据中心畅通运行
  5. win7 wmp12播放rmvb格式的一些问题
  6. 【圣诞文】用python带你体验多重花样圣诞树
  7. Postgres 子查询 介绍
  8. MySQL之两个字段的in
  9. 龙芯linux x86 模拟器,关于linux for loongson和wine的一些疑问,请大神解答,谢谢。...
  10. 【那些年,我们一起追的女孩】 第一章