HIT软件构造学习笔记与心得—3.4

摘要:
面向对象编程
继承和重写
多态和重载
接口,抽象类,具体类
泛型和泛型编程

重载和重写
▪方法覆盖是一种语言功能,它允许子类或子类提供已由其某个超类或父类提供的方法的特定实现。
子类可以重新实现父类中的方法

  • 子类中的实现通过提供与父类中的方法具有相同名称,相同参数或签名以及相同返回类型的方法来覆盖(替换)超类中的实现。
  • 执行的方法版本将由用于调用它的对象确定。
    • 如果父类的对象用于调用该方法,则将执行父类中的版本,但如果使用子类的对象来调用该方法,则将执行子类中的版本。
  • 根据调用时的对象类型决定被调用方法的版本
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
第一个根本就无法实例化。。。
第二个会发出“Woof”
第三个“Moo”
第四个“Moo”? 其实不是,moo()既不是重载也不是重写,在编译阶段就会报错。

在这里插入图片描述
这两个T是一致的,括号里的T和外面返回值的T都是的T。

OOP以类为核心概念
主要内容:泛型,继承,多态,动态分派

对象:包括属性和方法,static的是类属性和类方法,属于类,为每个实例共有
静态方法只可以调用静态属性和静态方法,而实例方法可以调用所以

接口
只定义了方法,没有实现任何方法,一个接口可以扩展其他接口(通过extends)
一个类可以有多个实现,一个类可以实现多个接口(对多继承的补偿)

用构造函数一定程度上破坏了抽象,(用户可以通过参数猜测内部实现细节)
接口不能有构造方法,所以创建对象时需要调用某个具体实现的构造方法

可以用工厂方法解决表示依赖的问题,隐藏实现
下图中,valueOf就是一个工厂,负责调用构造方法

在这里插入图片描述
接口的优点:
有助于编译器发现ADT实现中的bug,也有助于用户脱离于代码理解方法
可以根据需求选择合适的实现,实现性能的折中
ADT的规格说明中,对方法的实现未明确指定,给实现提供了自由
实现多个接口,算是对Java不支持多继承的一种补偿

信息隐藏
内部数据和 实现细节的隐藏程度是模块化设计质量评价的最重要标准
API同实现分离
模块间只通过API通讯
优点:
解耦:各模块之间可以独自开发实现并测试
加速开发:互不影响,并行开发
易于边界维护
能够提高效率
提高代码复用率

可见度:

在这里插入图片描述
重写override
子类可以实现父类的方法,根据调用时的对象决定调用的版本
Final标记的父类方法不能被重写,final标记的类不能继承,final标记的变量不能改变引用
重写要具有相同签名,相同可见度,相同返回值,相同名字,相同参数
最好写上override,可以帮助编译器检查

抽象类:
介于具体类和接口之间,存在抽象方法的类称为抽象类,可以有属性
抽象类不能实例化
某个抽象类的子类在实例化时必须保证已经实现了抽象类的所有方法

多态
分为三类:类的多态(泛型),方法的多态(重载,重写),子类型的多态
多态性是指为不同类型的实体提供一个接口,或者使用一个符号来表示多个不同的类型。
一个函数可以 有多个同名的实现(方法重载)
一个类型名字可 以代表多个类型(泛型编程)
一个变量名字可以代表多个类的实例( 子类型)

重载
重载是指在一个类中存在多个同名函数,必须具有不同的参数 列表,返回值类型可同可不同
重载为调用者带来了方便(便于记忆同类方 法的名字)
重载可以根据需要实现多个同名的方法
通过参数列表决定依赖那个实现,编译时决定调用谁
重载必须改变参数列表,其余可变可不变

在这里插入图片描述
在这里插入图片描述
参数类型不同为重载,第6个的引用为Animal,不能吃特定食物,编译失败
参数相同的为重写,第3个实际是Horse,所以能吃草

在这里插入图片描述
泛型
泛型不能用instanceof判断,泛型不能构造为数组E【】的样子
用一个占位符号代替一堆类,编译时对其进行类型擦除,改为相应的类

在这里插入图片描述
泛型抽象接口
Public interface Set{

}
泛型方法:

在这里插入图片描述
泛型类中的泛型方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Java中的泛型不型变

在这里插入图片描述

子类型的多态
一个类型代表了一组值 子类型是超类型的子集
B是A的子类型,当且仅当B的规格说明至少同A的一样强
但是规格说明的强弱,编译器无法判断 。以下的错误行为要避免:
加强前置前置条件,减弱后置条件,减弱父类给出的保证

子类可以转换为父类,水果 a=new 苹果,向上造型
避免向下造型

Instanceof
(instanceof 是操作符,不是方法)
在这里插入图片描述
尽可能避免用 instanceof,特别是在超类中检查某个对象是否是其子类的对象(当class为obj的父类时,编译器不报错,在运行时才会返回FALSE)
除了在equals()方法中,不要使用instanceof,会带来类型不安全

再看mutable和immutable
Mutable不好:
表示泄露会威胁不变性和表示独立性
无法在不影响客户 端的情况下,修改具体实现
用immutable
不设置setter
用private final
Getter进行防御式拷贝

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值