博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
抽象类与接口
阅读量:5037 次
发布时间:2019-06-12

本文共 1737 字,大约阅读时间需要 5 分钟。

经常搞不清抽象类和接口之间的关系,所以决定记下来

抽象类

  《Thinking in Java》一书中对抽象类的定义为:

包含了抽象方法的一个类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成

abstract(抽象)。否则,编译器会向我们报告一条出错消息。

  其实用关键字abstract修饰的类即是抽象类,即使该类中没有用abstract修饰的抽象方法。

抽象方法

  抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

abstract void method_name()

  抽象方法必须用 abstract 修饰,含有抽象方法的类就是抽象类,必须在类前用 abstract 修饰。

由于抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

  由此可以看出抽象类就是为了被继承而存在的,抽象类中包含了子类的共通特性。如果定义了一个抽象类却不去继承它,相当于白白创建了这个抽象类。

  同时,抽象类也跟普通类一样,可以拥有成员变量和普通的成员方法。

抽象类和普通类的区别  

  1. 抽象方法必须为public或者protected,缺省情况下默认为public。如果用private修饰,则该方法不能被子类继承,子类便无法实现该方法。
  2. 抽象类不能实例化,即不能创建对象。
  3. 如果一个类继承了一个抽象类,则该类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。

接口

  接口,英文称作interface。在软件工程中,接口泛指供别人调用的方法或者函数,是对行为的抽象。在Java中,定一个接口的形式如下:

[public] interface InterfaceName {}

  接口中可以包含基本数据类型的数据成员和方法,需要注意的是接口中的数据成员都默认为static和final,接口中方法只能是public abstract修饰的抽象方法。

  接口中的所有方法都不能有具体实现。实现接口的类必须实现接口中所有的抽象方法,一个类可以实现多个接口,通过关键字implements

class className implements interface1,interface2,[...]{
}

  如果抽象类实现了一个接口,该抽象类可以不实现接口中的抽象方法。

抽象类与接口的区别

参数 抽象类 接口
默认的方法实现 可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类通过extents关键字继承抽象类。如果子类不是抽象类,需要实现父类中所有声明的方法的实现 子类通过关键字implements实现接口,需要提供接口中所有生命方法的实现
构造器 可以有构造器 不能有构造器
与普通类的区别 除了不能实例化,其他的跟普通类没有任何区别 接口是完全不同的类型
访问修饰符 抽象类方法可以用public、protected和default修饰 接口方法只能用public修饰,成员属性只能定义为 public static final
main方法 抽象类可以有main方法且可以运行 接口没有main方法,不能运行
多继承 抽象方法可以继承一个类或者实现多个接口 只能继承一个或多个接口
速度 速度比接口要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果在抽象类中添加新方法,可以给该方法提供默认的实现,不需要改变现在的代码 在接口中添加新方法后必须改变实现该接口的类

什么时候使用抽象类和接口 

  1. 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  2. 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  3. 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

参考资料:

  

  
  《Java编程思想》

转载于:https://www.cnblogs.com/vocaloid-fan1995/p/10363831.html

你可能感兴趣的文章
谷歌 chrome 浏览器开发者工具打不开的解决方法
查看>>
PHP 简单实现webSocket
查看>>
BZOJ 4085:[Sdoi2015]quality(round 2 音质检测)(数据结构)
查看>>
hdu 2433
查看>>
pure virtual、impure virtual、non-virtual函数的接口继承和实现继承
查看>>
Maven Jetty SSL配置
查看>>
HDU 1060 Left-most Digit
查看>>
POJ 2942 Knights of the Round Table
查看>>
centos 7环境下安装jdk
查看>>
Coursera台大机器学习课程笔记3 – 机器学习的可能性
查看>>
Leetcode 82
查看>>
Lab 1: Pipeline MIPS Processor
查看>>
XUtils===XUtils3框架的基本使用方法
查看>>
leetcode 验证回文串 java
查看>>
coj 1224 ACM小组的古怪象棋
查看>>
HDOJ 1166 敌兵布阵
查看>>
css中的列表样式
查看>>
python 多线程
查看>>
spring boot打成可执行jar
查看>>
linux实现开机自启动脚本
查看>>