Java开发 抽象【学习篇12】

【作者前言】:13年入圈,分享些本人工作中遇到的点点滴滴那些事儿,17年刚开始写博客,高手勿喷!以分享交流为主,欢迎各路豪杰点评改进!
[1]

知识点内容

1. 抽象 [2]

简单的理解,Java的抽象就是只声明行为接口(方法签名)而不完成具体的实现
Java中,抽象类主要用来进行类型隐藏;也就是使用抽象的类型来编程,但是具体运行时就可以使用具体类型
利用抽象的概念,能够在开发项目中创建扩展性很好的架构,优化程序
抽象类,抽象方法,在软件开发过程中都是设计层面的概念。也就是说,设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并覆盖抽象方法,实现具体功能
理想的继承树应该是:所有叶子都是具体类,而所有的树枝都是抽象类。在实际中当然不可能完全做到,但是应尽可能向此目标靠(接口继承)
在面向对象的概念中,知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如形状类是抽象的类,圆、三角形等是具体类

⬇️圈重点···背熟···⬇️
用abstract修饰的类就是抽象类。抽象类是抽象方法的容器,如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。抽象类中也可以包含有非抽象的方法甚至抽象类中可以没有抽象方法(只要一个类不应该有具体对象,就应该是抽象类,不一定是有抽象方法的)
抽象类不可以直接实例化,只可以用来继承作为其他类的父类存在
抽象类的派生子类应该提供对其所有抽象方法的具体实现
如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化,但可以有构造函数(用于帮助子类快速初始化共有属性)
⬆️圈重点···背熟···⬆️

2. 具体说明一下抽象 [3]
abstract 可以修饰类也可以修饰方法
public abstract class 类名{ //抽象类
}
访问控制符 修饰符 返回值类型 方法名(){}
抽象方法只有方法声明,没有方法实现没有{}
public abstract void method();

1、如果某个类中包含有抽象方法,那么该类就必须定义成抽象类
The type Person must be an abstract class to define abstract methods

image.png

image.png

2、抽象类中也可以包含有非抽象的方法甚至抽象类中可以没有抽象方法
image.png

3、抽象类不可以直接实例化
Cannot instantiate the type Person
image.png

4、抽象类的派生子类应该提供对其所有抽象方法的具体实现
如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化,但可以有构造函数
The type Man must implement the inherited abstract method Person.eat()
image.png

image.png

可以有构造方法
image.png

抽象方法同样用abstract说明,抽象方法没有方法体,只有方法签名
可以这么认为,抽象方法实际上就是由抽象基类强制要求其派生子类必须实现的方法原型
构造方法和final、static方法(后续讲解)不可以修饰为abstract
抽象方法必须位于抽象类中
定义抽象类和抽象方法后,除了上述提到的作用外,对于程序来说也是一个重要的开发规范约束,如果子类继承抽象类后没有完全实现要求实现的抽象方法,编译器将会给出对应的提示:两个解决问题的方式:
1.实现抽象方法
2.将本类也定义为abstract抽象类
image.png

image.png

3. 接口 [4]

接口是设计层面的概念,往往由设计师设计,将定义与实现分离
程序员实现接口,实现具体方法
面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一
面向接口编程的意思是指在面向对象的系统中所有的类或者模块之间的交互是由接口完成的
在jdk1.8以前 java接口
1、特殊的抽象
2、所有的属性都是公开静态常量
3、所有的方法都是公开抽象的方法

image.png

image.png

声明成员变量列表,即便没有修饰符,它们也是public static final的,成员变量也只能被这几个修饰符修饰
声明成员方法列表,即便没有修饰符,它们也是public abstract的,成员方法也只能被这两个修饰符修饰

Java中接口的一般定义形式如下:

[访问权限] interface 接口名 {
        公开静态常量列表;
        公开抽象方法列表;
    }

eg:

image.png

接口抽象类对比
在Java中接口是一个比抽象类更加抽象的概念,由于只声明行为,因此在接口中的方法均是抽象的,下表中罗列了接口和抽象类的差异

image.png

Interfaces cannot have constructors

image.png

Abstract methods do not specify a body
image.png

从上面的表格可以看出:
成员变量方面,在接口只存在公开静态常量(即便没有使用static final修饰,Java也会默认确定其性质)
成员方法方面,在接口只存在公开抽象方法(即便没有abstract修饰,Java也会默认其抽象性质)

4. 实现接口 [5]

extends 用于继承,implements 用于实现

image.png

新的接口可以继承自原有的接口,新接口将拥有原有接口的所有抽象方法
Java接口继承接口原则
Java接口可以继承多个接口
接口继承接口依然使用关键字extends不要错用成implements
因此,在声明接口之间的继承关系时,extends关键字后面可以是一个列表
Java接口继承接口的形式
Interface3 extends Interface0, Interface1, interface……{

image.png

刚才已经提到,接口是比抽象类抽象层次更高的一个概念,因此和抽象类一样,它不能用于实例化对象,只能作为继承树的高层结构被子类实现(子类实现接口被称为implements(实现),其体现形式和继承类似)
类实现接口,本质上与类继承类相似,区别在于“类最多只能继承一个类,即单继承,而一个类却可以同时实现多个接口”,多个接口用逗号隔开即可。实现类需要覆盖所有接口中的所有抽象方法,否则该类也必须声明为抽象类
接口定义的是多个类都要实现的操作,即“what to do”。类可以实现接口,从而覆盖接口中的方法,实现“how to do”
类实现接口的一般语法如下:
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
}
一个类可以同时继承自一个父类并实现若干接口
implements用于指定该类实现的是哪些接口。当使用implements关键字接口列表中存在多个接口名时,各个接口名之间使用逗号分隔

个人理解:


image.png
  • 主要类型和次要类型
    USB鼠标:主要类型是 输入设备 次要类型是USB设备
    USB鼠标 继承输入和USB
    但是Java属于单继承
    出现接口 表现次要类型
    现实例子:手机:主要:通信工具 次要 :录像机 录音机、照相机、笔记本、
    板砖:主要:建筑材料 次要:板凳、武器
  • 接口其实就是一个规范
    情景说明:
    红色灯泡 设计成正常 圆
    绿色灯泡 设计成 螺旋
    黄色灯泡 设计柱状
    我要杂货店买台灯,台灯自带灯泡,发红光
    灯泡厂家如果要想生产灯泡 ,根据国家规定 设置型号

    image.png

    image.png

    image.png

    Java是单继承,一个类已经继承了一个类,那么就无法再去继承其他类
    Java是单继承多实现
    image.png

2.应用场景:


3.实现目标:


4.代码实现:




  1. 【知识点回顾·简介】 ↓↓↓

  2. [抽象] ↩

  3. [具体说明一下抽象] ↩

  4. [接口] ↩

  5. [实现接口] ↩

你可能感兴趣的:(Java开发 抽象【学习篇12】)