上一节学习了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 )的更多相关文章

  1. HIT软件构造课程3.2总结(Designing Specificaton)

    本节转向“方法/函数/操作”如何定义 上一节是名词 这一节是动词 1.编程语言中的函数和方法 方法 使用者不需要知道方法内部如何实现,这叫做“抽象”. 参数 参数类型是否匹配,在静态检查时完成. 返回 ...

  2. 麻省理工18年春软件构造课程阅读02“Java基础”

    本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材 ...

  3. 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性

    一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...

  4. Object Oriented Programming python

    Object Oriented Programming python new concepts of the object oriented programming : class encapsula ...

  5. JavaScript: Constructor and Object Oriented Programming

    Constructor :  Grammar: object.constructor Example: Javascript code: 1 function obj1() { this.number ...

  6. leetcode@ [355] Design Twitter (Object Oriented Programming)

    https://leetcode.com/problems/design-twitter/ Design a simplified version of Twitter where users can ...

  7. opp(Object Oriented Programming)

    嗯,昨天忙了一天没来及发,过年啊,打扫啊,什么搽窗户啊,拖地啊,整理柜子啊,什么乱七八糟的都有,就是一个字,忙. 好了,废话也不多说,把自己学到的放上来吧.嗯,说什么好呢,就说原型链啊 原型对象 每个 ...

  8. oop(Object Oriented Programming)

    嗯,昨天忙了一天没来及发,过年啊,打扫啊,什么搽窗户啊,拖地啊,整理柜子啊,什么乱七八糟的都有,就是一个字,忙. 好了,废话也不多说,把自己学到的放上来吧.嗯,说什么好呢,就说原型链啊 原型对象 每个 ...

  9. 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 ...

随机推荐

  1. 打造你的第一个 Electron 应用

    Electron 可以让你使用纯 JavaScript 调用丰富的原生(操作系统) APIs 来创造桌面应用. 你可以把它看作一个 Node. js 的变体,它专注于桌面应用而不是 Web 服务器端. ...

  2. openwrt 外挂usb 网卡 RTL8188CU 及添加 RT5572 kernel支持

    RT5572 原来叫 Ralink雷凌 现在被 MTK 收购了,淘宝上买的很便宜50块邮,2.4 5G 双频.在 win10 上插了试试,果然是支持 5G.这上面写着 飞荣 是什么牌子,有知道的和我说 ...

  3. Linux系统是什么?亲身自学经历分享

    我是数字媒体专业学生,第一次接触LINUX的时候,是大一C语言课程里看到的,书上讲了C语言的发展历史.说到C语言的起源,就离不开UNIX系统.在20世纪60年代,贝尔实验室的研究员Ken Thomps ...

  4. LeetCode 41,一题解读in-place思想

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode题解系列第21篇,今天来看一道人狠话不多的题目. 题面 题目非常简单,只有一句话,给定一个整数数组,要求返回最小的不在 ...

  5. rabitmq + php

    消费者 <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => ...

  6. 【视频+图文】Java基础经典练习题(一)输出2-100之间的素数,及素数个数

    目录 第一题:判断2-100之间有多少个素数,并输出所有素数. 1.视频讲解: 2.思路分析: 代码讲解:以i=4为例 4.为大家准备了彩蛋: 能解决题目的代码并不是一次就可以写好的 我们需要根据我们 ...

  7. vue 模板 template init

    <template> <div> </div> </template> <script> export default { name: '模 ...

  8. mysqli_query($conn, "set names utf8"); //**设置字符集*** 不设置插入数据库就是乱码

    mysqli_query($conn, "set names utf8"); //**设置字符集*** 不设置插入数据库就是乱码

  9. Python基础篇(二)_基本数据类型

    Python基础篇——基本数据类型 数字类型:整数类型.浮点数类型.复数类型 整数类型:4种进制表示形式:十进制.二进制.八进制.十六进制,默认采用十进制,其他进制需要增加引导符号 进制种类 引导符号 ...

  10. (转)springBoot 配置信息一览

    原文链接:https://cloud.tencent.com/developer/article/1360699