面向对象表编程——抽象类和接口

目录

一、抽象类(abstract)

1、抽象类的引出

二、抽象类的概念

 三、抽象类

1、抽象方法

 2、抽象类与实例化

 3、抽象类的子类

 4、抽象类和构造方法

四、接口

 1、接口的基础使用

 2、接口表示能力

 3、关键字的补充

 五、全部代码


一、抽象类(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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值