Java笔记_第一章_对象导论

1.1 抽象过程

1:所有的编程语言都提供抽象机制

2:人们所能够解决问题的复杂性直接取决于抽象的类型何抽象质量,所谓的抽象的类型指的是"我们所要抽象的对象是什么"

3:面向对象编程语言,同时也是Java编程语言的五大基本特征

  3.1 万物皆对象:

  3.2 程序是对象的集合,对象之间通过发送消息来告诉对方所要做的:方法调用

  3.3 每个对象都有自己的由其它对象所构成的存储

  3.4 每个对象都具有自己的类型

  3.5 某一特定类型的所有对象都可以接收同样的消息

1.2 每个对象都有一个接口

1:第一个面向对象的语言是 Simula-67,在该编程语言中首次使用关键字 class 来引入新的对象

2:在我们开发的过程中,在面向对象的程序设计中实际上进行的是创建新的数据类型(猫类型,狗类型,这都是一个我们可以创建的新的数据类型),在面向对象程序设计中实际上都是用 class 这个关键词来表示数据类型,所谓的数据类型,也就是我们常说的类。

3:类为什么会是数据类型呢?因为一个类描述了具有相同特性(数据元素) 和 行为(功能)的对象集合。

4:一种观点:我们所设计的任何的程序,都是系统的仿真,面向对象技术可以将大量的问题很容易降解为一个简单的解决方案

5:创建一个简单的对象

Light lt = new Light();
lt.on();    // 开灯
lt.off();    // 关灯
lt.brighten() // 调亮
lt.dim()    // 调暗

 

在前面我们提到了一个关键词"消息",我们所说的发送消息实际上就是给某个对象给对象中的方法发送请求,每一个请求都会有一个与之相关联的方法,当向对象发送请求时,与之相关联的方法就会被调用,执行方法中相应的代码。

例如我们上面所创建的一个简单程序,在程序中创建了一个对象,我们可以通过向对象发送消息,来调用对象中的方法

1.3 对象=服务提供者

1:我们可以将对象想象成一个"服务提供者",我们开发程序的目的就是为了向用户提供某项服务,我们通过调用某个对象的服务来实现这个目的。我们程序员所要做的目标就是去创建能够提供理想的服务来解决问题的一系列对象

2:将对象看作服务提供者的另一个好处是,它有助于提高对象的内聚性

1.4 被隐藏的具体实现

1:在书本中提到的一个概念:

  类创建者:创建新数据类型的程序员(或说创建新类的程序员),类创建者的一个主要目的就是构建类

  客户端程序员:使用"类创建者"所创建的数据类型的类消费者,客户端程序员的一个主要目的就是收集各种类来进行开发

2:类创建的目标是创建类,所创建的类只向客户端程序员暴露必须的部分,而将其它的部分进行隐藏

3:为什么要隐藏部分?

  如果将某部分进行隐藏,说明客户端程序员将不能够访问被隐藏的这一部分,这意为着类创建者可以任意的修改被隐藏的部分,而不用担心对其他人造成影响。再者因为被隐藏的部分通常为该类中最为脆弱的部分,容易被不知内情的程序员所破环。

4:要进行访问控制的原因:

  如上方所述,让客户端程序员无法触及它们所不因该触及的部分

  访问控制的第二个原因,允许类创建者在改变类内部的工作方式而不会影响到客户端程序员

5:在Java中利用三个关键词在类的内部设定边界,public,private,protected,默认的

  private:修饰的成员变量和函数只能在类本身和内部类中被访问。

  protected: 修饰的成员变量和函数能被类本身、子类及同一个包中的类访问。

  public:修饰的成员变量和函数可以被类、子类、同一个包中的类以及任意其他类访问。

  默认情况(不写)下,属于一种包访问,即能被类本身以及同一个包中的类访问

表格为各个关键字的作用范围

作用域

当前类中

同一package

子孙类

其它package

Public

Protected

×

Friendly

×

×

Private

×

×

×

 

1.5 代码复用

1:代码复用是面向对象程序设计语言所提供的最了不起的优点之一

2:使用现有的类合成新的类,这种概念称为组合,如果组合是动态发生的,则称为聚合

3:组合的依赖性强于聚合,聚合(班级和学生之间的关系),组合(学生和心脏之间的关系)

4:在建立新的类时候,我们应该先考虑组合,因为组合更加的灵活

1.6 继承

1:当我们创建类A后,后来我们再创建了类B,如果我们创建的类B和类A具有类似的功能,我们还是得重新创建一个新的类,如果我们能通过以类A为基础,复制类A,当我们再创建新的类B时,就可在类A的基础上进行修改即可,通过继承我们可以完成以的需求。

2:两个类型具有相同的特性和行为,但其中的一个类型可能比另一个含有更多的特性,并且可以处理更多的消息

3:通过继承可以实现类型的等价性:当继承现有类型时,也就创造了一个新的类型,这个新的类型不仅包括现有类型的所有成员,而且它还复制了基类的接口,也就是说所有可以发送给基类(源类,父类,超类)对象的消息也可以同时发送给导出类(继承类,子类),从以上的说明我们可以看出"导出类和基类具有相同的类型"

4:当子类继承父类时,子类可以在父类的基础上进行一定的修改,修改的方式有两种

  4.1:直接在导出类中添加新的方法

  4.2:改变现有父类的方法,也成为方法覆盖

 1.7:多态

...待补充

1.8:单根继承

1:所谓的单跟继承就是:在但跟继承结构中的所有对象都具有一个共用的接口,所有的类都继承单一的基类,在除了C++以外的所有面向对象编程语言中,都具有单根继承这样的特性,而这个基类就是Object。在JDK文档中有这样的一句话"类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法"。

2:为什么会有单根继承的存在呢,因为单根继承存在着诸多的好处,

  2.1:单根继成结构保证所有对象都具备某些功能

  2.2:单根继成使垃圾回收器的实现变得容易多了(在C++中并不存在垃圾回收器这个东西,垃圾回收器是Java对C++的一个巨大的改变之一)

1.9 容器

1:创建一种类型,这种新的对象类型持有对其它对象的引用

2:为什么存在不同的容器:

  2.1:不同的容器提供不同类型的接口和外部行为

  2.2:不同的容器对于某些操作具有不同的效率

3:举例 ArrayList 和 LinkedList 两个容器的区别:

  在ArrayList中,随机访问一个元素所花费的时间是相同的,而对于LinkedList来说,随机选取元素需要在列表中移动,这种的代价是高昂的,访问越靠经表尾的元素所花费的时间就会越长

  如果想在序列中插入一个元素,LinkedList所花的开销却比ArrayList要小

4:向下转型:基类向下转型为更具体的导出类类型;向上转型是安全的,例如我们将Circle类型转为Shape来行,因为Circle本来就是Shape的一种类型,所以向上转型是安全的;但如果我们进行向下转型时,将Object转为其子类,但我们不知到子类是Circle还是Shape,除非我们能肯定所要转的类型,否则向下转型几乎是不安全的;但是向下转型并非是不安全的,如果向下转型出现了转为错位的类型,就会出现传说中国的异常,

5:向下转型和运行时的检查需要额外的符出时间,也需要程序员付出心血

6:范型

ArrayList<shape> list = new ArrayList<Shape>();

 

...

1.10 对象的创建和声明周期

1:当我们使用对象时,最应该关心的是对象的创建和对象的销毁方式,因为当我们创建对象时,必须给对象赋予一定的资源,例如内存,当一个对象不再起作用时,我们应该立即将对象清理掉,使其占有的资源被释放和重新利用起来

2:对象销毁?这个听起来不是挺简单的一件事吗,当对象不用时候将销毁不就行了。对象销毁存在的问题:当对象处理完后,系统的其它部分还可能在处理该对象

3:在C++中,对象的存储空间和生命周期可以在程序编写时确定,可以通过堆栈,限域变量,静态存储区域来进行实现,这种存在一个困难,就是我们在编写程序时必须知道对象的确切数量,生命周期和类型,牺牲了灵活性

3:在Java中使用的是利用被称为堆的内存池中动态的创建对象,利用这种方式,直到程序运行时才知道需要多少对象,它们的生命周期如何,以及它们的类型是什么,这些问题的答案只有到程序在运行时执行到该代码时才会被确定。

4:如果要创建一个新对象,可直接在堆中创建,因为存储空间是在运行时动态管理的,所以需要大量的时间在堆中分配存储空间,这可能要远远大于在堆栈中创建存储空间的时间,在堆栈中创建存储空间和释放存储空间往往需要一条指令即可

5:在java中完全使用动态内存分配方式,当要创建对象时使用 new 关键词即可

6:对象的销毁:对允许使用堆栈创建对象的语言编译器可以确定其对象存活的时间,并可以自动销毁;而在堆栈中创建的对象,编译器就会对它的生命周期一无所知

7:Java中的"垃圾回收器":它可以发现对象何时不被使用,并将对象销毁。垃圾回收器避免了内存泄露的问题

1.11 异常处理,错误处理

1:异常处理将将错误处理直接放置在编程语言中,甚至放置于操作系统中,异常是一个对象,异常处理就像是与程序的正常执行路径并行的,在发生错误时会执行另一条路径,因为它是一种完全分离的执行路径,所以她不会干扰正常路劲的执行代码

2:异常处理不是面向对象的特征,异常处理在面向对象语言出来出现之前就已经存在了

1.12 并发编程

1:在计算机编程中的一个基本概念,就是同一时刻处理多任务的思想

2:在程序中,这些彼此独立运行的部分称为线程

本笔记整理至《Java编程思想》

^_^

posted @ 2019-04-23 21:55  一头牛这么多人放  阅读(172)  评论(0编辑  收藏  举报