抽象类与接口
前言
在一次笔试中有让我写抽象类与接口的区别,当时的我是十分的懵逼的不仅对抽象的概念十分的模糊,还对接口的概念也是十分的模糊,当时的我直接在网上百度了区别就复制粘贴了没有思考很多,对于这样的概念好像自己就从来不知道,但是反过来想实际上自己是知道的,会用。后面我就对这个方面的东西进一步的学习与了解
下面是关于抽象类与接口
一、抽象类
- 从概念上来说是由abstract关键字修饰的类就是抽象类,并且在抽象类中包含有抽象方法,同样这样的方法也是由abstract修饰的。还有就是如果一个类中包含抽象方法那么这个就是一个抽象类且为必须。
- 抽象方法
抽象方法的产生是为了方法统一,这个方法的实现由他的子类负责,子类继承这个抽象类的时候就会重写其中的抽象方法。那么在这里就可以知道了这样的一个方法上的概念,就好比我们去买车有很多的牌子的车并且这样的车子多多少少都有很多的共性的东西,比如都可以开动。那么问题就来了,每个车子的类里面我们都会有这样的一个车子跑的方法,那么我们怎么管理,既然都是一样的是一个车子,那么这个时候我就将这样的共性属性方法提取出来声明为一个父类,这样我们每个车子只要继承这样的一个父类就能够拥有这样的一个开动的方法。那么这个方法的抽取过程就是我们的抽象方法产生的情景。父类的这个抽象方法知识将方法抽象出来了,需要这个方法直接继承这个借口重写这样的方法就可以使用了。
-
将必要的方法统一化,继承这个类的时候必须重写抽象类中的方法。
-
抽象类
1.抽象类不能创建对象,如果创建,编译将无法通过而报错
2.抽象类中,可以有构造方法,是提供子类创建对象是,初始化父类成员使用的。
3.抽象类中,可以有成员变量
4.抽象类中,不一定包含抽象方法,但是包含抽象方法的类必须为抽象类
5.继承抽象类则需要重写抽象类(父类)中的所有抽象方法。
- 在上面的讨论中可以知道车子因为跑而继承这样的抽象类,那么还有其他的属性呢。并且不能够写在一个抽象类中,因为这样的属性时少数车辆有的属性方法,难道在继承一个吗?当然这个不行的因为在java中继承是单继承的,那么接口就这样产生了。
二、接口
- 接口是一种定义规范的方式。是java语言中的一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(jdk7以前)、默认方法、静态方法(jdk8以后)。接口的定义,他与定义类的方式相似,但是使用的是interface关键字来修饰。它会被编译为.class文件,但是一定要明确它并不是类而是另外一种引用数据库类型。
- 引用数据类型:是对象数据类型,指向一个对象,不是原始值,指向对象的变量是引用变量。
数组,类,接口
- 接口的使用
它不能创建对象,但是可以被实现implements类似于被继承。一个实现接口的类(可以看做是接口的子类),需要实现接口中的所用抽象方法,创建该类对象就可以调用方法了,否则它必须是一个抽象类。
- 在java中继承的体系是单继承的但是对于接口的实现来说是多实现的
这也是上面问题的解决,在整个车子的创建过程中可能会有多种的特征相同还有很多不同的特征,那么这个时候就不使用继承了,我们使用接口来定义这样的方法,那么不同的时候就可以多实现了。这样不就十分的完美了吗。
三、关于抽象类与接口的其他
- 接口实现了对原有的类的功能扩展
- 抽象方法:使用abstract修饰,在接口中可以省略,没有方法体,供子类使用
- 含有default(默认)与static(静态)修饰,不可以省略,供子类调用或者子类重写。static可以直接调用
- 非抽象子类实现接口(只是不能使用extends修饰使用,用implements)
1.必须重写接口中所有的抽象方法
2.继承了接口的默认方法,既可直接调用,也可以重写。
- 默认方法的使用(default不能去掉):可以继承可以重写,二选一,但是只能通过实现类的对象进行调用。
- 静态方法:接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。
- 在实现多个接口的时候,有相同的方法则需要重写一次。默认方法有重名的,那么子接口需要重写一次。
四、抽象类和接口的对比
4.1相同点
- 都位于继承的顶端,用于被其他类实现或继承
- 都不能直接实例化对象
- 都包含抽象方法,其子类都必须覆写这些抽象方法
4.2区别
- 抽象类为部分方法提供了实现(有代码块),避免了子类重复实现这些方法,这些方法,提高代码的重用性。
- 接口只能包含抽象方法(jdk8以后可以有default,static但是不常用)
- 一个类只能继承一个直接父类(可能是抽象类)却可以实现多个接口(我认为这就是接口出现的直接原因)
- 抽象类为继承体系中的共性内容
- 接口为继承体系中的扩展功能
4.3成员区别
- 抽象类:变量,常亮,有构造方法,有抽象方法,有非抽象方法
- 接口:常量,抽象方法,(jdk8以后有default,static但是不常用)
4.4关系区别
- 类与类:继承,单继承
- 接口与接口:继承,单继承,多继承
- 类与接口:实现,单实现与多实现
4.5设计理念
- 抽象类
对共同的父类作抽取,包括属性行为
- 接口:
对行为抽象,主要是行为
总结
最后对于抽象类与接口就差不多了,在以后的代码中一定还会遇到这样的情况,但是对于一个程序猿来说这些解释基础,真的,只有自己面对一些这样的问题才会自己产生这样的自觉,对于一个学生来说,基础是十分的重要的。抽象与接口就到这里了,因为在平时的代码中,经常不会去思考这样的一系列的问题,所以就会产生很多的盲区,那么就扫盲吧!!