HIT软件构造课程3.4总结(Object-Oriented Programming )
上一节学习了ADT理论,这一节学习ADT的具体实现:OOP
1.基本概念:对象,类,属性,方法
对象
对象是状态和行为的捆绑。java中,状态=成员变量,行为=方法。
类
每个对象都定义了一个类,类定义了成员变量和方法.类的方法就是他的application Programming interface(API)
API定义了怎样和实例交互。
类中的静态和实例变量/方法
静态方法
就是类方法,静态方法无法直接调用非静态成员。
实例方法
需要引用一个类中变量和方法的实例。
2.接口和枚举类型
接口
接口中只有方法的定义,没有实现。接口之间可以继承和扩展,一个类可以实现多个接口,一个接口可以有多个实现类。
java接口和类
接口:确定ADT规约。类:实现ADT
也可以不使用接口。实际中更倾向于采用接口来定义变量。
接口中不能有构造函数。
4.封装和信息隐藏
信息隐藏
API同实现分离,模块间只通过API通讯。
信息隐藏在接口中
使用接口类型声明变量,客户端仅适用接口中定义的方法,客户端代码无法直接访问属性。
成员的可见性修改
private:仅该类可见。protected:子类可见,同一包可见。default:子类不可见。public :都可见
信息隐藏的最好练习
所有成员都应该是私有的。
5.继承和重写
(1)可重写的方法与严格继承
严格继承:子类只能添加新方法,无法重写超类中的方法(超类中方法都是final的)。
加了final就不可以重写。
Final
局部变量:无法重新赋值
方法:无法重写
类:无法继承
重写
子类使用完全同样的签名。重写的时候,不要改变原方法的本意。
使用@override
(2)抽象类
抽象方法和抽象类
抽象方法:只有定义没有实现。
抽象类:抽象类不能实例化
继承某个抽象类的子类在实例化时,所有父类中的抽象方法必须已经实现。
子类型实现相同操作,放在父类型里面,子类型无需重写。有细微差别则重写。
6.多态、子类型、重载
(1)三种多态
特殊多态:一个方法可以有多个同名的实现(方法重载)
参数化多态:一个类型可以代表多个类型(泛型编程)
子类型多态:一个变量名字可以代表多个类的实例
(2)特殊多态
重载
多个方法具有同样的名字,但有不同的参数列表或返回值类型。方便client调用,client可用不同的参数列表,调用同样的函数。
重载是静态多态
根据参数列表进行最佳匹配,静态类型检查,在编译阶段确定要具体执行哪个方法。
与之相反,重写方法是在运行阶段进行动态检查。
重载规则
不同的参数列表,可以在一个类中重载也可以在子类中重载。
重写和重载
签名相同为重写,签名不同为重载。子类重载了父类的方法后,子类仍然继承了被重载的方法。
(3)参数多态性和泛型编程
参数多态性
参数多态性是指方法针对多种类型时具有同样的行为,此时可用统一的类型表达多种类型。
在运行时会根据具体指定类型确定,叫做泛型(generics)
java中的泛型
使用泛型变量的三种形式:泛型类、泛型接口和泛型方法。
类中如果声明了一个或多个泛型变量,则为泛型类。这些类型变量称为类的类型参数
类型变量
例子::public interface List <E>
public class Entry<keytype,valuetype>
泛型接口
泛型接口的实现类前面加上@Override即可
泛型方法
泛型类/接口,是在实例化类的时候指明泛型的具体类型
泛型方法,是在调用方法的时候指明泛型的具体类型
(4)子类型多态性
一个类只有一个父类,但是可以实现多个接口。
子类型
b是a的子类型 即 每个b都是a
子类型的静态检查
子类型的规约不能弱化超类型的规约。
instanceof
检查一个对象是否为一个类的实例。
类型转换
不要向下转换
不要从一个超类向子类转换。
10.一些重要的对象方法在java中
equals 判断两个对象是否相等
hashCode hash map中的hash码
toString
toString()的重写
@Override public String toString()
11.设计好类
不可变类型的优点
间接性
固有的线程安全
可以被任意分享
不需要防御式拷贝
优秀的架构板块
如何写一个不可变的类
不要提供任何可变类型
确保没有任何方法被重写
类都是final private
补全 toString ,hashcode,clone,equal
确保任何可变成分安全
什么时候让类不可变
没有其他原因就让类不可变
什么时候让类可变
最小化可变性
12.OOP的历史
HIT软件构造课程3.4总结(Object-Oriented Programming )的更多相关文章
- HIT软件构造课程3.2总结(Designing Specificaton)
本节转向“方法/函数/操作”如何定义 上一节是名词 这一节是动词 1.编程语言中的函数和方法 方法 使用者不需要知道方法内部如何实现,这叫做“抽象”. 参数 参数类型是否匹配,在静态检查时完成. 返回 ...
- 麻省理工18年春软件构造课程阅读02“Java基础”
本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材 ...
- 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性
一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...
- Object Oriented Programming python
Object Oriented Programming python new concepts of the object oriented programming : class encapsula ...
- JavaScript: Constructor and Object Oriented Programming
Constructor : Grammar: object.constructor Example: Javascript code: 1 function obj1() { this.number ...
- leetcode@ [355] Design Twitter (Object Oriented Programming)
https://leetcode.com/problems/design-twitter/ Design a simplified version of Twitter where users can ...
- opp(Object Oriented Programming)
嗯,昨天忙了一天没来及发,过年啊,打扫啊,什么搽窗户啊,拖地啊,整理柜子啊,什么乱七八糟的都有,就是一个字,忙. 好了,废话也不多说,把自己学到的放上来吧.嗯,说什么好呢,就说原型链啊 原型对象 每个 ...
- oop(Object Oriented Programming)
嗯,昨天忙了一天没来及发,过年啊,打扫啊,什么搽窗户啊,拖地啊,整理柜子啊,什么乱七八糟的都有,就是一个字,忙. 好了,废话也不多说,把自己学到的放上来吧.嗯,说什么好呢,就说原型链啊 原型对象 每个 ...
- Week 5: Object Oriented Programming 9. Classes and Inheritance Exercise: int set
class intSet(object): """An intSet is a set of integers The value is represented by a ...
随机推荐
- 打造你的第一个 Electron 应用
Electron 可以让你使用纯 JavaScript 调用丰富的原生(操作系统) APIs 来创造桌面应用. 你可以把它看作一个 Node. js 的变体,它专注于桌面应用而不是 Web 服务器端. ...
- openwrt 外挂usb 网卡 RTL8188CU 及添加 RT5572 kernel支持
RT5572 原来叫 Ralink雷凌 现在被 MTK 收购了,淘宝上买的很便宜50块邮,2.4 5G 双频.在 win10 上插了试试,果然是支持 5G.这上面写着 飞荣 是什么牌子,有知道的和我说 ...
- Linux系统是什么?亲身自学经历分享
我是数字媒体专业学生,第一次接触LINUX的时候,是大一C语言课程里看到的,书上讲了C语言的发展历史.说到C语言的起源,就离不开UNIX系统.在20世纪60年代,贝尔实验室的研究员Ken Thomps ...
- LeetCode 41,一题解读in-place思想
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode题解系列第21篇,今天来看一道人狠话不多的题目. 题面 题目非常简单,只有一句话,给定一个整数数组,要求返回最小的不在 ...
- rabitmq + php
消费者 <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => ...
- 【视频+图文】Java基础经典练习题(一)输出2-100之间的素数,及素数个数
目录 第一题:判断2-100之间有多少个素数,并输出所有素数. 1.视频讲解: 2.思路分析: 代码讲解:以i=4为例 4.为大家准备了彩蛋: 能解决题目的代码并不是一次就可以写好的 我们需要根据我们 ...
- vue 模板 template init
<template> <div> </div> </template> <script> export default { name: '模 ...
- mysqli_query($conn, "set names utf8"); //**设置字符集*** 不设置插入数据库就是乱码
mysqli_query($conn, "set names utf8"); //**设置字符集*** 不设置插入数据库就是乱码
- Python基础篇(二)_基本数据类型
Python基础篇——基本数据类型 数字类型:整数类型.浮点数类型.复数类型 整数类型:4种进制表示形式:十进制.二进制.八进制.十六进制,默认采用十进制,其他进制需要增加引导符号 进制种类 引导符号 ...
- (转)springBoot 配置信息一览
原文链接:https://cloud.tencent.com/developer/article/1360699