目录
一、抽象类(abstract)
1、抽象类的引出
向上转型带来的好处就在于参数统一化,使用一个共同的子类引用,可以接受所有的子类实例。
此时有这样一个需求,一个描述图形的类和它的子类,要求大家创建一个方法可以接受图形类以及它的所有子类的对象,调用print方法
多态时非常依赖子类重写的,而普通父类又不能强制子类重写,这时候就需要用到抽象类,来强制要求子类重写。
二、抽象类的概念
若要强制要求子类重写方法,就要用到抽象类。
在现实生活中有很多都是抽象类,这些类都是概念化的,没法具体到某个实例,来描述这一类对象的属性和行为。比如说人类就是一个抽象类,没办法对应具体某个或者某一类人(中国人,美国人,日本人,山顶洞人)
抽象类是普通类的“超集”,只是比普通的类多了一些抽象方法而已,抽象方法所在的类必须是抽象类,子类若继承了抽象类,就必须重写所有的抽象方法(此时子类都是普通类,不能是也是抽象类)
三、抽象类
1、抽象方法
抽象方法所在的类必须使用abstract声明为抽象类。
抽象方法指的是使用abstract关键字声明,只有函数声明,没有函数实现的方法,称为抽象方法
抽象方法:使用关键字abstract声明的只有方法声明没有方法体(“{}”)的方法
提问:在java中,没有方法体的方法就是抽象方法?
错的嘞,以为本地方法也是没有方法体,而不是抽象体。
public final native void notfyAll();
2、抽象类与实例化
若一个类使用abstract声明为抽象类,无法直接通过该类实例化对象,哪怕是该类中一个抽象方法都没有。
当一个类是抽象类时,不管它有没有抽象方法,这个类本身就是一个抽象的概念,没办法具体到某个特定的实例。
此时通过抽象类去实例化对象就会出错,此时我们就只能通过子类向上转型来变为抽象父类的引用
3、抽象类的子类
当子类继承了抽象类,就必须强制子类重写抽象类的所有抽象方法(子类都是普通类),同时也满足单继承权限,一个子类只能继承一个抽象类。
4、抽象类和构造方法
抽象类是普通类的超集(普通类有的内容,抽象类全都有),只是比普通类多了一些抽象方法而已,抽象类虽然没办法直接实例化对象,但是也存在构造方法。子类在实例化时,仍然遵守继承的原则,先调用父类的构造方法,然后调用子类的构造方法。
四、接口
接口的两种使用场景:
①接口表示具备某种能力或者行为,子类实现接口不一定要满足子类 is a fulei关系,而是具备这种行为或者能力就可以。比如说,游泳这个能力,Person可以满足,Dog可以满足,Duck也满足。
②接口表示一种规范或者标准。比如说“USB接口”,“5G标准”。
1、接口的基础使用
接口中只有全局常量和抽象方法,也就是更加纯粹的抽象概念,其它东西(构造方法,普通方法)都没有。接口的使用关键字interface声明,子类使用implements实现接口。
鼠标和键盘都属于USB接口的子类,就是说需要用到USB线连接到电脑的都是USB的子类,那么此时的电脑就是USB的规范的使用者,所有USB的子类都必须满足这个规范。
那么为什么accept方法的参数用的是USB引用呢?
对于电脑的使用者或者生产者来说,我根本就不关心到底那个具体的设备插入到了电脑上,只要这个设备能满足USB接口,就都可以被电脑识别。此时就可以实现一个接口可以接受好多中=种设备,只要这个设备满足USB接口,就可以插入电脑并且被识别。
假如说accept(Mouse mouse),此时这个接口就只能插入鼠标,其他的满足USB接口的设备就不能被使用,这样下来一台电脑就需要好多个接口,就会十分的麻烦。
假设此时又多了一个Camera的子类,但是对于电脑这个类来说,其实一点影响都没有,方法代码不会改变,只要这个子类满足accrpt接口,就可以直接插入使用。
这就是多态的扩展性。
2、接口表示能力
接口允许多实现,一个类可能具备多个能力,同时实现多个父接口,此时如果子类时普通类,就要重写所有的抽象方法
相比于抽象类来说,接口更为广泛,只要满足接口或者具备这种能力,就可以实现。
3、关键字的补充
由于接口只有抽象方法和全局常量,因此在接口中
public abstract=>抽象方法
static final=>常量
这两个关键词可以省略,在接口中会默认为抽象方法和全局常量
五、全部代码
任枭雄/rocket_class_Grammer - Gitee.com