类继承的实现和作用

面向对象编程之继承与多态
一、类的继承
1、格式:public class 子类名 extends 父类名
2、作用:
(1)子类可以直接调用父类的属性和方法,减少了子类中属性和方法的定义
(2)直接显示出现实中的关联关系
3、对于子类特有的方法和属性,只有子类对象类型才能调用
二、自动转型与强制转型
自动转型:
1、格式:父类名 类名简称=new 子类名()
2、特点:
(1)由子类对象自动转型为父类类型时,子类对象只能调用在父类中存在的方法
(2)子类对象属于父类属性类型
强制转换:
1、格式:子类名 类名简称2= (子类名) 类名简称1
2、特点:
(1)父类类型对象转型为子类类型对象
(2)强制转换格式不会出现错误,但逻辑上会出现错误。
(3)只有当需要转型的对象,在创建时是一个子类对象才能进行父类转子类变换
三、重写
1、原因:子类有与父类相同的方法定义,但方法体不一样的时候,需要进行重写
2、特点:
(1)先继承后重写
(2)子类与父类方法一样,方法体不一样
3、重写与重载的不同:重写是子类先继承了父类的方法。但有其特殊点,运用父类方法
不能充分表明时,进行重写。重载是一个类中定义多个构造器的方法。
四、多态
1、定义:相同类型的对象调用同样的方法,由于方法体的不同导致的结果的不同。
2、特点:先继承->重写->多态
### 同时继承实现接口的限制 在面向对象编程中,某些语言(如Java)存在一种限制:一个只能单继承一个,但可以实现多个接口。这是因为单继承的设计旨在减少多重继承带来的复杂性潜在冲突问题[^1]。 #### 单继承的原因 单继承的主要目的是为了简化程序设计中的复杂度。如果允许多重继承,则可能会引发诸如菱形继承等问题,在这种情况下,当两个父拥有同名方法时,编译器无法判断应该调用哪个版本的方法。因此,像Java这样的语言选择了只允许单一继承的方式来规避这些问题[^4]。 然而,尽管不允许直接从多个继承,但是可以通过接口的形式达到似的效果。接口提供了一种方式让能够声明它支持特定的行为集合而不必关心这些行为的具体实现细节。这样既保持了型的灵活性又避免了多重继承可能引入的技术难题[^3]。 #### 解决方案——组合优于继承 面对上述提到的限制条件之一就是采用“组合”而非传统意义上的“继承”。也就是说不是通过使某个新型成为现有型的子型来获得功能上的增强,而是创建一个新的组件并将所需的功能作为该组件的一部分嵌入其中[^2]。这种方法不仅绕过了关于是否能同时继承其他以及实现若干个不同契约之间相互作用所造成的困境,而且往往还能带来更好的可读性与更容易测试的应用架构。 外值得注意的是,在一些现代高级别的脚本型语言里(比如 Python),虽然也遵循似的理论框架即不鼓励复杂的多层次继承关系构建,但由于其动态特性的缘故实际上提供了更为灵活的操作空间让用户自行决定如何处理这情况下的需求满足过程[^1]。 ```python class Engine: def start(self): print("Engine started") class Car: def __init__(self): self.engine = Engine() # Composition def start_engine(self): self.engine.start() my_car = Car() my_car.start_engine() ``` 以上代码展示了利用组合代替继承一个简单例子。在这里我们并没有让`Car`去继承任何东西,相反地我们将一个独立的对象 `Engine` 放置到了我们的汽车实例当中从而实现了相同的目的却避开了那些由经典意义下严格定义出来的父子级联所带来的麻烦之处。 ### 结论 综上所述,在大多数主流OOPLs之中确实存在着针对单一基底别之外再额外附加其它形式约束的规定;不过借助于良好规划后的关联策略依旧可以让开发者们达成预期目标的同时维持住整个系统的清晰结构布局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值