上一节学习了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. [LeetCode] 207. Course Schedule 课程表

    题目: 分析: 这是一道典型的拓扑排序问题.那么何为拓扑排序? 拓扑排序: 有三件事情A,B,C要完成,A随时可以完成,但B和C只有A完成之后才可完成,那么拓扑排序可以为A>B>C或A&g ...

  2. JZOJ 3928. 【NOIP2014模拟11.6】射击

    3928. [NOIP2014模拟11.6]射击 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 有问题, ...

  3. 续python学习(一)

    接上面没写完的知识点继写. 当然,这些知识点都很简单,可能没必要花费太多时间去记忆,多写写代码就会了. 5.字符串的使用.索引和切片是字符串主要的两个应用.索引:顾名思义就是找出某个字符在一个字符串中 ...

  4. 跨域解决方案之CORS

    什么情况表示遇到跨域请求 一般在前后端分离项目中,前端请求接口,浏览器控制台报如下错误 类似 No 'Access-Control-Allow-Origin' header 报错 为什么会有跨域请求 ...

  5. 从0系统学Android--5.2 发送广播

    从0系统学Android--52 发送广播 本系列文章目录:更多精品文章分类 本系列持续更新中.... 初级阶段内容参考<第一行代码> 5.3 发送自定义广播 前面已经学习了如何接受广播了 ...

  6. [每日一题系列] LeetCode 1013. 将数组分成和相等的三个部分

    题目: 给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + . ...

  7. ReentrantLock 源码分析以及 AQS (一)

    前言 JDK1.5 之后发布了JUC(java.util.concurrent),用于解决多线程并发问题.AQS 是一个特别重要的同步框架,很多同步类都借助于 AQS 实现了对线程同步状态的管理. A ...

  8. 初识JVM:(一)JVM工作原理和流程

    本文主要参考:http://blog.csdn.net/CSDN_980979768/article/details/47281037?locationNum=7&fps=1 声明:主要用于个 ...

  9. python_字符串&列表&元组&字典之间转换学习

    #!/usr/bin/env/python #-*-coding:utf-8-*- #Author:LingChongShi #查看源码Ctrl+左键 #数据类型之间的转换 Str='www.baid ...

  10. iconfont字体图标的使用方法(转)

    我之前因为项目用bootstrap比较多,所以使用font awesome字体图标比较多,后来接触到了iconfont,发现想要的什么图标都有,还可以自定义图标,非常强大!之前看了一波教程,觉得繁琐, ...