标题图
前言
对于面向对象编程来说, 抽象是它的特征之一.
在 Java 中, 实现抽象的机制分两种, 一为抽象类, 二为接口.
抽象类为 abstract class, 接口为 Interface.
今天来学习一下 Java 中的抽象类和接口.
目录
什么是抽象
什么是抽象类
什么是接口
区别
代码例子
结语
什么是抽象
从具体事物抽出, 概括它们共同的方面, 本质属性与关系等, 称为抽象. 看不见, 摸不着的东西叫做抽象, 抽象是人们对世界万物的感觉, 用特定的图像表达出来, 要理解抽象的东西, 就必需从内心感受它们.
举例, 红色这个词语本身, 在没有建立存在色彩这种概念以前, 就是一个很抽象的东西. 抽象说直白点就是把现实生活中复杂的问题抽象成一个简单的问题. 举个例子, 如人这个现实中的东西, 抽象下就是 person 这个对象, 对象有名字即类名, 接着有属性即年龄, 性别, 身高等. 对于对象中的方法即是人要吃饭, 睡觉等.
什么是抽象类
抽象类的定义和使用格式
abstract class 类名 {
类体
}
class 类名 extends 抽象类 {
- // 实现全部抽象方法
- }
抽象类是
类对象的抽象集合
, 抽象类使用 abstract 关键字修饰, abstract 不能与 final 并列修饰同一个类, 在抽象类中具体抽象的是属性和行为, 在抽象类中, 含有抽象方法的类为抽象类, 一定是抽象类, 但抽象类中不一定含有抽象方法.
抽象类不能被实例化, 如果要实例化, 需通过子类继承抽象类, 然后子类必须重写父类的所有抽象方法. 抽象方法在抽象类, 仅此声明, 方法的具体实现在子类中进行. 抽象类只有被继承才有用武之地.
- // 抽象类
- public abstract class Person {
- public abstract void run();
- }
- // 子类继承抽象类
- public class Studentone extends Person{
- @Override
- public void run(){
- System.out.println("人会跑");
- }
- }
- // 测试
- public class Test {
- public static void main(String[] args){
- Person person = new Student();
- person.run();
- }
- }
- // 结果
人会跑
什么是接口
接口的定义和使用格式
interface 接口名 {
[public] [static] [final] 变量;
[public] [abstract] 方法;
}
class 类名 implement 接口列表 {
- // 实现所有接口中声明的方法
- }
接口是
类行为方法的抽象集合
, 类行为方法, 是对方法进行抽象, 接口不是一个类, 对于抽象类, 它是
对对象的抽象集合
, 对象即包含对属性和方法, 接口是比抽象类更加抽象的一种.
Java 中的接口是为了降低功能模块间的耦合, 子接口中所有方法都是抽象的, 都是公有的. 接口中的属性是全局常理即为 public static final 的, 方法即 public static 的. 关键字 implements 实现接口, Java 中不能继承多个抽象类, 但能实现多个接口, 记住接口只能继承接口.
- interface Demo{
- void sleep();
- void play();
- }
- class Test implements Demo{
- void sleep();
- void play();
- }
类必须实现接口中所有的方法, 但抽象类可以不用实现接口中的所有方法.
区别
抽象类和接口语法层次
- public abstract class Demo {
- abstract void method1();
- void method2(){
- }
- }
- interface Demo {
- void method1();
- void method2();
- }
可以看出接口是抽象类的特殊化.
抽象类和接口设计层次
抽象类是对类抽象, 而接口是对行为的抽象.
抽象类为继承关系, 接口为实现类与接口之间的契约关系.
抽象类为单继承, 接口为多 "继承". 子类只能继承一个抽象类, 但可实现多个接口.
代码
- // 抽象类
- abstract class Person {
- abstract void run();
- abstract void jump();
- }
- // 接口
- interface School{
- void go();
- }
- // 实现
- class Student extends Person implements School{
- void run();
- void jump();
- void go();
- }
抽象类中成员变量默认为 friendly, 函数修饰符 public,protected,default.
接口属性为静态, public static final, 成员函数为 public.
来源: http://www.jianshu.com/p/6f843e2f47ca