JavaSE:抽象类和接口

1、抽象类

1.1 什么是抽象类

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类主要用于继承

我们可以看如下代码:

Animal这个类无法描述某一个具体的对象,因为它包含是所有动物的共性,那么我们就可以把Animal这个类定义为抽象类。

1.2 抽象类语法

当我们在一个类的前面加了abstract关键字修饰,那么这个类变成了抽象类:

注意:抽象类也是类,它也可以包含普通类可以包含的成员变量和成员方法

1.3 抽象类的特性

1. 抽象类当中可以包含抽象方法,这个方法可以没有具体的实现

例如,在上面的代码中,我们重写了父类的eat方法后, 我们根本就没有用到父类的eat方法,用到的是自己重写的方法:

那么此时,我们就可以把父类的eat方法定义为抽象方法

语法也是加上关键字abstract

2. 定义了抽象方法的类一定是抽象类。

也就是说,如果有一个类定义了抽象方法,那么这个类一定是抽象类。

这也是抽象类和普通类的区别:抽象类中可以定义抽象方法。

3. 继承了抽象类的普通类一定要重写抽象类中的抽象方法

如果这个普通类没有重写,是会报错的。

如果不想重写,那么继承的类也需要变为抽象类:

4. 抽象方法不能是private的,也不能被static和final修饰,因为要被重写

5. 抽象类不能被实例化

抽象类的存在就是为了被继承,因此不能被实例化,但是可以包含构造方法(子类帮助父类完成初始化)。

1.4 抽象类出现的意义

相信很多人读到这里都会有一个疑问:“你不是说抽象类就是为了被继承吗,那我直接拿一个普通类不行吗,然后重写需要的方法,要这个抽象类干嘛”

对,你说的没错,普通类也是可以的,但我想说的是,计算机语言中很多的语法的设置,就是为了让程序员能够尽早的发现错误,避免出现损失,抽象类就是起这个作用的:

1.实际工作不应该由父类完成, 而应由子类完成。 那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的, 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题。

2.能够提醒我们在子类中重写抽象方法。

2、接口

2.1 什么是接口

接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

2.2 接口的语法

接口可以看做是抽象类的升级。

接口的语法和类的语法类似,只是将class关键字换成了interface关键字:

2.3 接口的特性

2.3.1 成员的默认属性

在接口中,成员变量的属性默认是public static final修饰的,

成员方法的属性默认是public abstract修饰的(也不需要给出具体的实现)。

2.3.2 接口的使用规范

1. 创建接口时, 接口的命名一般以大写字母 I 开头

2. 接口的命名一般使用 "形容词" 词性的单词

3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性(例如:不用写public static final int a = 10;直接写int a = 10就可以)

2.3.3 接口的特性

1.接口是类使用关键字implement来实现的

(此处报错是因为没有重写接口当中的抽象方法)

2.实现接口后,与抽象类相同,必须重写接口当中的抽象方法

3.如果接口中的方法被default、static修饰,那么可以有具体的实现

4.如果一个类不想重写接口当中的方法,那么就可以把这个类定义为抽象类,但是一旦这个类被其他类继承,那么那个类就需要重写所有的没有被重写的抽象方法

5.接口不可以被实例化,接口中也不能有构造方法和静态代码块

6.接口虽然不是类,但是也会生成.class字节码文件

7.一个类中可以实现多个接口

接口可以解决Java单继承问题

如上图,我们定义的Dog类不仅继承了父类Animal,而且实现了IRunning、ISwimming接口

需要注意的是:

1.Dog类需要重写所实现的所有的接口当中的抽象方法

2.必须先继承父类再实现接口

2.4 接口与继承语义上的不同

我们可以这样理解:

继承表达的是is-a的语义,例如:狗是一个动物,那么动物就是狗的父类。

接口表达的是具有xxx的属性,例如:狗可以跑,可以游泳,那么狗就可以实现跑和游泳的接口。

也就是说,接口可以让我们忽略掉类型,不管是什么类型,只有具备这个功能,我们就可以实现这个接口,例如:

只要机器人这个类会跑,会游泳,那么我们就可以实现这两个接口。

我们也可以使用接口向上转型调用重写的方法来完成多态:

2.5 接口间的继承

在Java中,类和类间只能是单继承关系,但是接口和接口之间是可以多继承的,也就是说一个接口可以继承多个接口。

接口间的继承需要使用关键字extends

接口的继承就相当于接口的拼接,使得这个接口具有所继承接口的方法。

一个接口继承了其他的接口后,如果有类实现了这个接口,那么这个类就需要实现所有借口的(继承下来的)抽象方法。

3、抽象类和接口的区别

核心区别:

抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而

接口中不能包含普通方法, 子类必须重写所有的抽象方法。

OK~本次博客到这里就结束了,

感谢大家的阅读~欢迎大家在评论区交流问题~

如果博客出现错误可以提在评论区~

创作不易,请大家多多支持~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值