Java中的抽象类以及接口及应用

发布时间:2024年01月16日

一、抽象类

类到对象是实例化,对象到类是抽象

?抽象类:

??? 1.什么是抽象类?

??????? 类和类之间具有共同特征,将这些共同特征提取出来,形成抽象类。

类本身是不存在的,所以抽象类无法创建对象(无法实例化)。

??? 2.抽象类属于什么类型?

?????? 抽象类也属于引用数据类型。

?? 3.抽象类怎么定义?

???????? 【修饰符列表】 abstract class 类名{

??????????? 类体;

?????????? }

?? 4.抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的,子类继承抽象类,子类可以实例化对象。

?? 5.final和abstract不能联合使用,这两个关键字是对立的。

?? 6.抽象类的子类可以是抽象类

?? 7.抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。

?? 8.抽象类关联到一个概念:抽象方法,什么是抽象方法呢?

???????? 抽象方法表示没有实现的方法,没有方法体的方法。例如:

?public abstract void doSome();

???????? 抽象方法的特点:

?????????? 1.没有方法体,以分号结尾

?????????? 2.前面修饰符列表中有abstract关键字。

???? 9.抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。

判断:java语言中凡是没有方法体的方法都是抽象方法?

?? 不对

????? Object类中就有很多方法没有方法体,都是以“;"结尾的,但他们都不是抽象方法。

例如: public native int hashCode();

?? 这个方法调用C++写的动态链接库程序。前面修饰符列表中没有:abstract,有一个native,表示调用JVM本地程序。

抽象类:

?? 1.抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。

?? 2.重要结论:一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现了。这是java语法上强行规定的,必须的,不然编译器就报错了。

?????? 这里的覆盖或者说重写,也可以叫做实现。(对抽象的实现)

?public class AbstractTest{

????? public static void main(String[] args){

??????? //能不能使用多态?

??????? //父类型引用指向子类型对象

??????? Animal a = new Bird(); //向上转型。(自动类型转换)

??????? //这就是面向抽象编程

??????? //a的类型是Animal,Animal是抽象的

??????? //面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力

??????? //这种面程符合OCP原则

??????? /*分析以下:

???????????? 编译的时候这个move()方法是谁的?

???????????????????? —编译的时候是Animal的

???????????? 运行的时候这个move()方法是谁的?

??????????????????? —运行的时候是Bird的

??????? a.move();

?????? }

?}

? //动物类(抽象类)

? abstract class Animal{

?????? //抽象方法

????? public abstract void move();

?? }

??

? //子类(非抽象类)

? //错误:Bird不是抽象的,并且未覆盖Animal中的抽象方法move()

? /*

? class Bird extends Animal{

? }

? */

??

? //如果Bird是抽象类的话,那么这个Animal中继承过来的抽象方法也可以不去重写/覆盖/实现

? abstract class Bird extends Animla{

? }

??

class Bird extends Animal{

???? //需要将从父类中继承过来的抽象方法进行覆盖/重写,或者也可以叫做“实现”

??? //把抽象的方法实现了

??? public void move(){

??? }

? }

??

? /*

??? 分析:

????? Animal是父类,并且是抽象类。Animal这个抽象类中有一个抽象方法move.

????? Bird是子类,并且是非抽象类。Bird继承Animal之后,会将抽象方法继承过来。

? */

二、接口

接口:

?? 1.接口也是一种“引用数据类型”,编译之后也是一个class字节码文件

?? 2.接口是完全抽象的。(抽象类是半抽象)或者也可以说接口是特殊的抽象类。

?? 3.接口怎么定义,语法是什么?

?????? 【修饰符列表】 interface 接口名{}

?? 4.接口支持多继承,一个接口可以继承多个接口。

?? 5.接口中只包含两部分内容,一部分是:常量。一部分是:抽象方法。接口中没有其他内容了,只有以上两部分。

?? 6.接口中所有的元素都是public修饰的。(都是公开的)

?? 7.接口中的抽象方法定义时:public abstract可以省略。

?? 8.接口中的方法都是抽象方法,所以接口中的方法不能有方法体。

?? 9.接口中的常量的public static final可以省略。

? 10.类和类之间叫做继承,类和接口之间叫做实现,仍然可以将“实现”看作"继承“。

继承使用extends关键字完成,实现使用implements关键字完成。

?11.结论:当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖,重写)

接口和接口之间支持多继承,那么一个类可以同时实现多个接口吗?

?? 对于计算机来说,一个机箱上有多个接口,一个接口是接键盘的,一个接口是接鼠标的,

一个接口是接电源的,一个接口是接显示器的……

?? 重点:一个类可以同时实现多个接口。

?这种机制弥补了java中的那个缺陷?

???? java中类和类只支持单继承,实际上单继承是为了简单而出现的,现实世界中存在多继承,java中的接口弥补了单继承带来的缺陷。

接口A和接口B虽然没有继承关系,但是写代码的时候,可以互转。编译器没意见。但是运行时可能出现:

ClassCastException异常。

?之前的一个结论:

?????? 无论是向上转型还是向下转型,两种类型之间必须要有继承关系,没有继承关系编译器会报错。(这个不适用接口方面)??

????? 最终实际上和之前还是一样,需要加:instanceof运算符进行判断

????? 向下转型养成好习惯。转型之前先if+instanceof进行判断

一个非抽象的类,实现接口的时候,必须将接口中所有方法加以实现。

接口中的方法不能有方法体。

继承和实现都存在的话,代码应该怎么写?

?? extends 关键字在前

?? implements 关键字在后

使用接口,写代码的时候,可以使用多态(父类型引用指向子类型对象)

三、接口在开发中的作用

接口在开发中的应用

??? 注意:接口在开发中的作用,类似于多态在开发中的作用

?多态:面向抽象编程,不要面向具体编程。降低程序的耦合度,提高程序的扩展力。

/*

? public class Master{

????? public void feed(Dog d){ }

????? public void feed(Cat c){ }

????? //假设又要养其他动物,那么这个时候需要再加一个方法。(需要修改代码)

???? //这样扩展力太差了,违背了OCP原则(对扩展开放,对修改关闭)

??? }

}

*/

?public class Master{

??? public void feed(Animal a){

??? //面向Animal父类编程,父类是比子类更抽象的。

?? //所以我们叫做面向抽象编程,不要面向具体编程。

? //这样程序的扩展力就强

? }

}

接口在开发中的作用?

??? 接口是完全抽象的。

??? 面向抽象编程可以修改为:面向接口编程

??? 有了接口就有了可插拔。可插拔表示扩展力很强,不是写死的。

???

?接口有什么用?

????? 扩展性好,可插拔。

?接口是一个抽象的概念

?分析:中午去饭馆吃饭,这个过程中有接口吗?

????? 接口是抽象的。

?菜单是一个接口。(菜单上有一个抽象的照片)

?谁面向接口调用。(顾客面向菜单点菜,调用接口。)

?谁负责实现这个接口。(后台的厨师负责把菜做好,是接口的实现者。)

?这个接口有什么用?

??? 这个饭馆的“菜单”,让“顾客”和“后厨”解耦合了。

?? 顾客不用找后厨了,后厨不用找顾客了。他们之间完全依靠这个抽象的菜单沟通。

面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。

接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度。)

接口可以解耦合,解开的是谁和谁的耦合?

???? 任何一个接口都有调用者和实现者。

???? 接口可以将调用者和实现者解耦合。

???? 调用者面向接口调用。

???? 实现者面向接口编写实现。

?以后进行大项目的开发,一般都是将项目分离成一个模块一个模块的。

?模块和模块之间采用接口衔接。降低耦合度。

?

?

类型和类型之间的关系:

? is a(继承)??? has a(关联)??? like a(实现)

??? is a :Cat is a Animal(猫是一个动物)

凡是能够满足is a的表示"继承关系"

A extends B

??? has a : I has a Pen(我有一支笔)

凡是能够满足has a关系的表示“关联关系"

关联关系通常以”属性“的形式存在

?A{

?????? B b;

??? }

?? like a:Cooker like a FoodMenu(厨师像一个菜单一样)

凡是能够满足like a关系的表示”实现关系")

实现关系通常是:类实现接口

A implements B

抽象类和接口的区别

?

?抽象类是半抽象的

?接口是完全抽象的

?抽象类中有构造方法

?接口中没有构造方法

?接口和接口之间支持多继承

?类和类之间只能单继承

?一个类可以同时实现多个接口

?一个抽象类只能继承一个类(单继承)

?接口中只允许出现常量和抽象方法

?以后接口使用的比抽象类多,一般抽象类使用的比较少

?接口一般都是对“行为”的抽象

??

文章来源:https://blog.csdn.net/m0_74249744/article/details/135616670
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。