前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Thinking In Java 第一章笔记

Thinking In Java 第一章笔记

作者头像
JathonKatu
发布2020-10-27 14:33:02
3850
发布2020-10-27 14:33:02
举报
文章被收录于专栏:JathonKatu

Start:第一章

Page:23-60

Date:20190123

Title:对象导论

绪论:

人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。这里的类型是指“所抽象的是什么。”

1.汇编语言是对底层机器语言的轻微抽象,

2.而命令式语言(Fortran,Basic,C)都是对汇编语言的抽象。

这个阶段的主要抽象仍要求在解决问题时要给予计算机的结构,而不是给予所要解决的问题的结构。

这个阶段的程序员需要建立机器模型和实际解决问题的模型之间的关联。

3.面向对象讲问题空间中的元素及其在解空间中的表示称为“对象”。这种思想的实际是:程序可以通过添加新类型的对象使自身适用于某个特定问题。

面向对象五个基本特征:

1.万物皆对象--可以存储数据,在自身执行操作,可以抽取任何待解问题的任何概念化构件。

2.程序是对象的集合,它们通过发消息来告知彼此要做的事。--可以把发消息看做是对特定对象某个方法的调用。

3.每个对象都有自己的由其他对象所构成的存储。--可以创建包含先有对象的包的方式来创建新类型的对象。(可以在程序中构建复杂的体系,同时将其复杂性隐藏在对象的简单性背后)

4.每个对象都拥有其类型。--每个对象都是一个类的实例,每个类最重要的特性就是,能够接受什么样的信息(有什么方法)。

5.某一特定类型的所有对象都可以接受同样的消息。(这种可替代性是oop中最强有力的概念之一)

综上,对象具有状态,行为和标识。意味着每一个对象都可以有内部数据和内部方法,每一个对象都可以唯一的和其他对象区分--即有一个唯一地址。

在程序执行期间,具有不同的状态而其他方面都相似的对象会被分组到对象的类中--class。创建抽象数据类型(类)是面向对象程序设计的基本概念之一。

类描述了具有相同特性和行为的对象集合,所以实际上一个类就是一个数据类型。--至此,程序员可以通过定义类来适应问题,而不是只能使用现有的机器中的数据类型。

接口确定了对某一特定对象所能发出的请求。但是,程序中必须有满足这些请求的代码,这些代码和隐藏的数据一起构成了视线。

在类型中,每一个可能的请求都有一个方法与之相关联。当向对象发送请求时,与之关联的方法就会被调用。

将对象看作是服务的提供者有助于提高对象的内聚性。在面向对象的设计中,每个对象都可以很好的完成一个任务,并不试图做更多的事情。

适当的将类的实现隐藏起来,可以不必担心类的编写者在改写时对使用者造成的影响,从而减少程序的bug。

访问控制的意义:1.让类使用者无法触及他们不应该触及的部分(任意修改方法的实现)2.允许设计者改变类内部的工作方式而不用担心会影响到使用者。

关键字:public,private,protected(继承的类可以访问protected以外,其他方面private与protected相同。)

代发服用是面向对象程序设计语言最了不起的优点之一。

使用任意数量的类合成新的类叫做组合,而如果这种组合是动态发生的就称为聚合。组合带来了极大的灵活性。

继承:

面向对象的缺点:

在创建一个类后,即使另一个新累与其具有相似的功能,你还是得重新创建一个新类。

通过继承,就能通过复制现有的类,修改活添加方法,达到实现新类的目的。

如果只是单纯的继承一个类,而不做其他事,意味着导出对象和基类拥有相同的类型和行为,这么做没有意义。

而造成导出类与基类不同的方式有两种:

1.添加方法--简单直接(但是要考虑是否可以将这个方法抽象到基类中)

2.导出类和基类的方法上产生差异。--被称为覆盖

在处理类型的层次结构时,经常想把一个对象不当做它所属的特定类型对待,而是将其当作其积累的对象来对待。--使人们编写出不依赖于具体类型的代码(接口引入前奏)

以几何形分为圆形,正方形,长方形,三角形等等为例。(泛化概念引入)

一个非面向对象变成的编译器产生的函数调用会引起所谓的前期绑定,这意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。

然而,在OOP中,程序直到运行时才能确定代码的地址,所以当消息发送到一个泛化对象时必须采用其他的机制。于是面向对象程序设计语言引入了后期绑定的概念。

编辑器只要保证被调用方法的存在,及对参数和返回值的类型进行把关,并不需要知道确切执行的代码。

JAVA的后期绑定实现是通过计算在对象中存储的信息来计算方法体的具体地址。每一个对象都能有不同德表现行为,当向一个对象发送消息时,该对象就能够知道应该进行什么动作。

在某些语言中,必须明确声明希望某个方法具备后期绑定的属性锁带来的灵活性(也就是说后期绑定需要特殊声明,例如C++)。这些语言中,默认情况下不是动态绑定的,而java中,动态绑定是默认行为,不需要额外的关键字来显示多态。

将导出类看作是他的基类的这个动作称之为向上转型。一个面向对象的程序肯定会在某处进行向上转型,才能将自己从必须知道确切类型中解放出来。

JAVA--单根继承,C++则不同。

单根继承结构中的所有对象都具有一个公用的接口,保证所有对象都具备某些功能。单根继承使垃圾回收器更加容易实现。对于所有对象都保证具有其类型信息,不会陷入无法确定对象类型的僵局,给编程带来巨大的灵活性。

容器:

List,Map,Set,队列,树,堆栈。

不同的容器提供了不同类型的接口和外部行为,不同的容器对于某些具体的操作也有不同的效率(ArrayList和LinkedList的查和增删改)。

在JAVA1.5之前,容器存储类型只有Object,所以可以存储任何东西,但是值得注意的是,存入这样的容器后再取回得到的事Object类型,如果要使用原来的导出类型的具体方法,这里就要涉及到向下转型了。

向上转型--泛化,向下转型--具体化。

向下转型和运行时的检查都需要额外的程序运行时间。创建这样的容器需要自己知道锁保存的对象类型,从而消除向下转型犯错的可能。这种解决方案被称为参数化类型机制。

JAVA1.5推出了参数化类型(范性)

使用对象最关键的问题就是其生成和销毁。对象的生存都需要资源,而当它不再被需要的时候,必须进行清理,使其占用类型能够重用和释放。

怎样才能知道对象应该被销毁?

C++认为效率控制最为重要,所以程序员拥有了选择的权力。对象的存储空间和生命周期可以在编写程序时确定,通过将对象置于堆栈或静态存储区。这种方式将存储空间分配和释放置于优先考虑的位置,当然也就牺牲了灵活性。必须在编写程序时知道对象确切的数量,生命周期和类型。

JAVA:在被称为堆的内存池中动态的创建对象,直到运行时才知道需要多少对象,生命周期如何,具体类型。存储空间运行时动态管理的,所以需要大量的时间在堆中分配存储空间,使用的时间可能远大于在堆中创建存储空间。在堆栈中创建存储空间和释放存储空间通常只需要一条汇编指令,分别对应将栈指针向下移动和将栈顶指针向上移动。创建堆存储空间的时间依赖于存储机制的设计。

对象区域复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大冲击。动态方式锁带来的更大的灵活性正式解决一般化变成问题的要点所在。

异常处理:

异常处理将错误处理直接置于编程语言之中,有事甚至治愈操作系统之中,异常是一种对象,从出错点被抛出,并被专门设计用来处理这种特定类型错误的相应的异常处理器捕获。现在可以不用退出程序进行错误处理,增加程序健壮性。

并发编程:

有时中断对于处理时间性强的任务是必须的,但是对于大量的其他问题,我们只是想把问题切分成多个可以独立运行的部分,从而提高程序的响应能力。在程序中,这些彼此独立运行的部分被称为线程,上述概念被称为并发。通常,线程只是一种单一处理器分配执行时间的手段,但是如果操作系统支持多处理器,那么每个任务都可以被指派给不同的处理器,并且他们是真正的并行执行的。

并发带来的问题就是资源共享,造成资源争夺导致死锁的结果。任务获取资源,锁定资源,完成任务,释放资源后其他争夺相应资源的任务才能够执行。

拓展:

插件(赋予浏览器新功能),

脚本语言(将客户端源代码嵌入到HTML页面中,解释这种语言的插件在HTML页面被现实的时候激活,缺点是代码会暴露给任何人。通常脚本语言不会处理复杂的事情。)

不需要任何插件的脚本语言:JavaScript

这里提出一个问题,范性是否其实只是在编译器对参数类型进行规范,实际上在运行期仍然是使用的object类型,不过是一种自动的向上转型和向下转型?(类似于基本类型和其包装类型的自动装箱拆箱?)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JathonKatu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档