对象导论
今天要学习的内容目录有:
对象导论
- 抽象过程
- 每个对象都有一个接口
- 每个对象都提供服务
- 被隐藏的具体实现
- 复用具体实现
- 继承
a) 是一个和像一个的关系
- 伴随多态的可互换对象
- 单根继承结构
- 容器
a) 参数化类型
- 对象的创建和生命期
- 并发编程
- 异常处理
- Java和Intern net
a) Web是什么
b) 客户端编程
c) 服务端编程
抽线过程:
- 什么是oop编程:object orited program
- 汇编语言是对机器语言的抽象,命令式语言是对汇编语言的抽象,可是仍然要基于计算机的结构,这并不是很贴切人类的思考方式。于是出现了面向对象语言
- 问题空间和解空间,抽象名词
- 别人总结的5个基本特性:
a) 任何事物都是对象
b) 程序是对象的集合,他们可以通过发送信息来通知彼此要做的事
c) 每个对象都有自己的由其他对象所构成的存储
d) 每个对象都拥有其类型
e) 某一个特性类型的所有对象都可以接收同样的消息
每个对象都有其接口:
- 接口是为了在这个请求中确定是哪个对象发送的(是为了辅助多态的实现)
- Unified model Language UML 统一建模语言
/**用文字叙述例子:狗的技能的方法中,如果告诉计算机,那么它就会根据所给的对象(狗的种类进行选择,不一样的技能。*/
每个对象都提供服务:
- 从中理解出来的思想是-》 要把类看成是服务的提供商,且这个服务越是单一化,就越专业,我们就越可以复用它,而不用在我们想要某一单一功能的时候冗余其他的功能。
- 专业术语: 高 内聚 –》 内聚是指服务单一化
被隐藏的具体实现:
- 程序开发中,被分为类开发者, 和客户端消费者。
- 例子:我们创建一个静态类作为工具,实现将字符串通过spit 方法进行划分,然后进行过滤数字,再打成jar包就可以当作一个插件,去给别人使用了,而别人或者自己也可以很快的使用这个插件进行开发而不用进行制造重复的轮子。 隐藏具体实现, 是为了让别人可以直接使用而不用去管,也不会破坏里面的内容。--》 通过访问实现的, 也就是4个private protect public default
关于复用代码的实现:
- 复用代码的两种方式: 直接new 对象进行引用, 或者组合的方式。一般因为面向对象的功能可以重新组合对象的方式,更为符合原则。
- 理解的例子:可以是,汽车组合了需要其他(引擎, 轮胎, 方向盘, 沙发)
关于继承:
- 继承就是,子类继承父类的所有方法,属性。
- 专业术语:基类, 导出类
- 例子: 几何图形, 三角形和正方形等拥有几何图形的长宽等特性,只要继承即可拥有几何图形的特性,而不用在三角形类中重复写出那些特性的代码
- 当方法的特性遇到冲突,也就是说导出类和基类的方法不一致的时候,又不想重新写一个的时候可以重写 , 意思是会覆盖父类的这个方法, 这样做会改变一个方法, 而保留其他不冲突的方法, 实现复用代码的灵活性
- 继承的关系是like-a , 是指导出类和基类之间是很相像的, 但他们不是一摸一样, 需要我们添加一些代码, 一些术语本身类才有的代码
多态的理解:
- 前面的时候也理解了,多态, 是向计算机查询某特性的时候,它会根据不同对象返回不同的数据, -》 狗狗的例子
- 那么多态是如何实现 的呢, 是用后期绑定(一种设计理念)的方式实现的, 在调用方法的时候, Java 对于后期绑定的方式和c++ (virtual进行实现)不同, 是默认调用
- 这种后期绑定的要求:
a) 它会去检查参数的类型(有这类型的编程语言是强类型的)
b) 它调用的地址是相对地址,而不是绝对地址, 调用中间会用一段代码进行计算这个相对的地址。
- 专业术语:
a) 向上转型: 导出类看作基类
b) 向下转型: 基类转化成导出类,这将会丢失原有的属性-》也就是数据的丢失
单根继承的结构:
1. 单根继承是指:所有类都有一个共有的父类,就是Object类
2. C++是不是单根继承, 这样子, 受到的限制很少,比较灵活, 但是兼容性差-》是指兼容其他不是继承Object对象的类, 中间需要通过多重继承机型兼容
3. Java比c++就是在与垃圾回收机制, 而不用自己去清理内存资源,这让程序员轻松了一定啊,偷了懒,另一方面, 对于内存的控制就没有全面。单根继承让它牺牲了灵活性, 但获得了兼容性,而不用每次都去创建一个复杂的继承体系。
容器:
- 每个编程语言都提供了许多容器, Java中也提供了容器的类库, List存储序列(顺序存储的排序),Map(关联数组的拍下,就是有key , value), set(数据不会重复的类型),以及, 堆, 栈, 树,等。 他们的实现是为了根数据结构的相适应, 而不是自己去写。
参数化类型:
- 参数化类型, 是指把数据的类型作为参数穿进去, 这里说的,我们之前说的范型的由来。
- 因为如果没有范型, 那么容器里面存的数据是Object类, 这跟它的实现有关, 容器里面存放的数据是可变, 但底层其实把类型都转化为了同一个类型Object类型,这样再用数组进行实现,这就可以作为容器使用了,可是这样面临着,类型都是Object的麻烦。
- 于是有了范型, 在传入容器的时候,传入数据的类型, 然后取出的时候自动转化为该类型就可以, 里面还面临着,向下转型的风险, 向下转型, 有可能丢失数据, 可是,这个类型是原本的类型,所以 转化回去的时候, 是不会丢失数据的
对象的创建和生命周期
- 专业术语:
- 方法区 方法区主要存储一些静态数据(比如string类型,方法区中有个静态常量池,一般比较String的时候就会去里面找,所以String a, b都等于同一个数值,但是如果比较起来就会是为true)
- 堆 存放引用数据
- 堆栈 基本数据类型都在里面
- 本地方法栈 对应native方法
- 程序计数器 类似计算机中的程序计数器 用于计数, 其很重要, 详解可以了解 汇编语言等其他书籍都有提到
- 在栈中编写的时候,顺便提一下,Java中是基本数据类型放在栈中。在栈中需要知道对象的确切数量,生命周期, 和类型。这样可以适合特定的类型,特性需求项目,这样开发时间久,适合大型项目
- 在栈中的数据要先编译而在堆中的数据都是在运行的时候才知道他们的生命周期,他们的具体类型要有多少对象, Java中引用类型都在堆中, 也就是说解释器, 很多是为了这些引用类型的,这种方式实现动态的分配内存, 这个在类型在代码上的关键字的实现就是那个new 一个类去引用。
- 关于生命周期, 在栈上面的对象,编译器可以知道对象的存活时间,他们编译后就知道了,而在堆上, 不能知道对象存活时间, c++是让程序自己手动释放, 而Java中是通过垃圾回收器进行释放。
异常处理问题:
- 关于异常只需要知道, 异常也是一个类, 方便程序员调试错误信息,试想如果没有异常的报告, 那么你有可能永远不知道是什么小Bug躲在角落让你的程序运行不起来。
- 异常要知道,异常处理是和当前程序并行运行的 , 它会记录下发生错误的信息,返回回去。
并发编程:
- 只要知道并行和并发的概念:并发(交替运行某一程序,很多程序并发,由于计算机运行过快,而让人有并行的错觉), 并行(同时运行某一程序,指的是双核cpu的时候)。
Java和inter net
- 客户机/服务器 client/server: 服务器就是用于分发信息, 客户机和服务器,是客户端软件版本更新,那么用户上的客户端软件也要进行更新
- 浏览器/服务器browser/server: 就是用浏览器去代替客户端 这样好处是不用每次 都进行客户端软件的更新。
- 客户端编程,是指能在浏览器中运行脚本完成一些较为简单的功能
- CGI common gateway interface 公共网关接口, 通过html中简单的数据收集的机制
- 脚本语言可以解决百分80 的浏览器功能, 剩下的比较难弄的就得用后端的编程去完成, 比如说是Java 比如是c#
- 在intranet(企业内的网络)中因为更新较为方便。 所以用客户端服务器就显得较为容易,这些选择架构得分清楚。
这一章留下了许多彩蛋,
- 比如think in enterprice Java 企业级Java编程思想,
- 数据定义,函数调用的模型。
- Oop并非适合所有人,那么python 你怎么看?
- 解决方案有许多种情况。 专业一点的说法就是, 解空间和问题空间, 多对一的情况中如何选择优秀的解法。
- 关于Java虚拟机, 关于编译,关于设计上,垃圾回收,单继承等的设计问题。
- 统一建模软件的应用啊