什么是抽象类

一般而言含有抽象方法的类是抽象类,那什么是抽象方法? 就是只有方法名,没有方法体.

但是,要是没有抽象方法,你写个abstract class xx{} 这个也是抽象类~
那么没有抽象方法的抽象类有什么用呢?
如果你不想该类被实例化,就可以这么写.

抽象类有什么用?

在提取父类的过程中,子类对某一个或多个有共性的方法有不同的实现,父类无法确定如何实现。所以父类就不实现了. 大家干的都是一样的事情,但是具体的实现暂时还不能确定.

举例

//抽象类不能创建对象,专门用作父类的
abstract class Shape{public abstract double area();//子类有各自的实现方式
}class  Circle_Area extends Shape{public static final double PI=3.14159;private  double radius;Circle_Area(double radius){this.radius=radius;}//子类需要重写父类的抽象方法@Overridepublic double area() {return PI*radius*radius;}
}

抽象类与接口的区别

抽象类中可以有实现了的方法,接口中不可以

如何选择用抽象类还是接口

a. 如果拥有一些方法,并想让他们中的一些有默认的具体实现,请选择抽象类
b. 如果想实现多重继承,那么请使用接口,由于java不支持多继承,子类不能继承多个类,但一个类可以实现多个接口,因此可以使用接口来解决。
c. 如果基本功能在不断变化,那么就使用抽象类,如果使用接口,那么每次变更都需要相应的去改变实现该接口的所有类。

抽象类在源码中的应用

比如,TreeSet的父类,AbstractSet就是个抽象类

  • AbstractSet 这个类就是一个没有抽象方法的抽象类~ 因为这里面是有实现了的方法的,所以是不能用接口的
  • 抽象类也是可以有构造方法的
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {protected AbstractSet() {}public boolean equals(Object o) {if (o == this)return true;
...}public int hashCode() {int h = 0;Iterator<E> i = iterator();...}public boolean removeAll(Collection<?> c) {Objects.requireNonNull(c);boolean modified = false;....}
}

AbstractCollection也是抽象类,其中包含了抽象方法和非抽象方法.

public abstract class AbstractCollection<E> implements Collection<E> {protected AbstractCollection() {}public abstract Iterator<E> iterator();public abstract int size();public boolean isEmpty() {return size() == 0;}public boolean contains(Object o) {Iterator<E> it = iterator();if (o==null) {...}public Object[] toArray() {// Estimate size of array; be prepared to see more or fewer elementsObject[] r = new Object[size()];Iterator<E> it = iterator();...}public <T> T[] toArray(T[] a) {// Estimate size of array; be prepared to see more or fewer elementsint size = size();...}private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;private static <T> T[] finishToArray(T[] r, Iterator<?> it) {int i = r.length;while (it.hasNext()) {...}private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflow...}public boolean add(E e) {throw new UnsupportedOperationException();}public boolean remove(Object o) {Iterator<E> it = iterator();if (o==null) {...}

对比下接口,接口中是不会有实现了的方法的 ,更不会有构造函数

public interface Set<E> extends Collection<E> {int size();boolean isEmpty();boolean contains(Object o);Iterator<E> iterator();Object[] toArray();boolean add(E e);boolean remove(Object o);...}

抽象类与设计模式

模板方法设计模式.
在一个抽象类中行为方法总是有一个默认行为,子类可以直接使用,也可以覆写。ArrayList继承了AbstractList,没有覆写的方法在使用时,直接使用AbstractList中的方法.

抽象类的缺点

单继承

总结

  • 抽象类可以有实现了的方法和构造函数
  • 接口中不可以有实现了的方法和构造方法
  • 抽象类添加实现了的方法其子类无需改动
  • 接口中添加方法其实现必须全部重写
  • 抽象类可以用于实现一种设计模式–模板设计模式

java 抽象类与接口的区别及其在jdk中的应用相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Java抽象类和接口的区别和联系

    抽象类 注:先将抽象类中的两种方法解释完,再综合解释抽象类 抽象方法 应用场景:其下所有子类都应该有该方法但是大部分子类具体的执行步骤是有所不同的. 必须重写:也可以说"必须实现" ...

最新文章

  1. pycharm第一个Python程序
  2. springboot学习笔记(十)
  3. 浅谈游戏单位属性模块设计:属性组成、分级、计算与同步
  4. 单例设计模式-序列化破坏单例模式原理解析及解决方案
  5. oracle 在线表分析报告,Oracle Statspack分析报告详解(一)
  6. 云空间-全面进入免费云时代-国内首家免费T级云空间!
  7. 2019.08.27BOM的六个子对象(2)
  8. c++ 数字后加f_Pandas 实战系列:数字格式设置
  9. 虚拟地址空间和物理地址空间
  10. 「ZigBee模块」协议栈-串口透传,打造无线串口模块
  11. 【ORB_SLAM3源码解读】IMU基础介绍、IMU姿态、速度、位置解算以及误差方程、坐标系
  12. uniapp在移动端软键盘监听(弹出,收起),及影响定位布局的问题
  13. 心理学与生活《感知与记忆》
  14. Mstar方案软件运行基本原理
  15. Android车载导航的一些困境
  16. kernel启动流程第二阶段
  17. vue移动端手机号正则表达式
  18. CRMEB小程序商城源码安装后,个人中心推广海报不显示处理方法!
  19. ASP无限分类数据库版
  20. win7 下anaconda 安装及安装包

热门文章

  1. 访问量100万的网站服务器,100万访问量 服务器配置
  2. 安装pkgconfig_一个R包怎么也安装不上,憋着急!
  3. proxmox 控制台无法连接_Proxmox VE 5的SPICE控制台和虚拟机声音设置
  4. iyiw oracle_Oracle 单行函数
  5. 苹果怎么删除通讯录联系人_苹果手机通讯录怎么恢复?这才是正确的打开方式!...
  6. 谷歌为什登不上去github_同声传译被攻陷!谷歌发布Translatotron直接语音翻译系统...
  7. Switch case 超经典练习题
  8. linux ubuntn j经验
  9. 在PHP中2中特殊数据类型是,@PHP中的数据类型(2)
  10. android编译的错误日志,android编译遇到错误