JavaSE——Java对象导论

一、抽象过程                                         

  人们所能够解决问题的复杂性直接取决于抽象的类型和质量。所谓抽象的类型指的是抽象的是什么,汇编语言是对底层机器的轻微抽象,命令式语言(FORTRAN、BASIC、C)是对汇编语言的抽象。这些语言所作的主要抽象仍要求在解决问题时要基于计算机的结构,而不是基于所要解决问题的结构。而面向对象语言则是面向解问题,将问题空间中的元素及其在解空间中的表示称之为“对象”。

对象具有状态(内部数据)、行为(方法)、标识(唯一的内存地址,也可能在硬盘中)。

  • 万物皆对象。理论上来讲,可以抽取任何待解决问题的概念化构件(狗、建筑物、服务等)将其视为对象。
  • 程序是对象的集合,它们通过发送消息来告诉彼此要做的。可以把消息想象为对某个特定对象的方法的调用请求。
  • 每个对象都有自己的由其他对象构成的存储。也就是说,可以创建包含现有对象的包的方式来创建新的对象。
  • 每个对象都有其类型。这里的类型是类的同义词。
  • 某一个特定类型的所有对象都可以接受同样的消息。也就是说子类对象必须要能够接受传递给父类对象的消息。

二、每个对象都有一个接口                              

  有人认为,类决定了接口,而类是该接口的一个特定实现。类表述了具有相同特性(数据元素)和行为(功能)的对象集合。所以,类是一个数据类型,就相当于基本类型的浮点型一样,所有的浮点型数据具有相同的特性和行为集合。如下面的代码所示,类型时Light,特定的Light对象时lt,圆点连接一个消息请求on(),面向对象的程序设计通常简单归纳为“向对象发送消息”。

Light lt=new Light();
lt.on();

 三、每个对象都提供服务                               

  将对象想象为“服务提供者”,有助于提高对象的内聚性。

四、被隐藏的具体实现                                  

  程序开发人员按照角色分为类创建者和客户端程序员。类创建者的目标是创建类,这种类只向客户端成员暴露必须的部分,而隐藏其他部分。被隐藏的部分通常代表对象内部脆弱的部分。因此,需要添加访问控制,访问控制的第一个存在原因就是让客户端程序员无法触及他们不应该触及的部分。第二个原因就是允许类库设计者可以改变类内部的工作方式而不必担心会影响到客户端程序员。

  Java三个关键字public、private、protected。

  • public:任何人都可以使用。
  • private:只有类型创建者和类型的内部方法可以访问。
  • protected:与private作用相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员。
  • 默认:包访问权限。

五、复用具体实现                                     

  代码复用是面向对象程序设计语言最了不起的优点之一。最简单的复用某个类的方式是直接使用该类的一个对象,此外也可以将那个类的对象置于某个新类之中,我们称之为“创建一个成员对象”。成员对象可以有多个,通常他们被声明为private,这种概念被称为组合。在创建新类时,应该首先考虑组合,因为它相较于继承更加简单灵活。

六、继承                                             

  当继承现有类型时,也就创造了新的类型。这个新的类型不仅包括现有类型的所有成员(除private成员),还复制了基类的接口。也就是说,所有发给基类对象的消息同时也可以发出给导出类对象。这也就意味着基类和导出类具有相同的类型。这便是继承产生的类型等价性。

  若要使基类和导出类产生差异,有两种方法:一种,在导出类中添加新方法,一种覆盖基类方法。

七、伴随多态的可互换对象                             

  在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而是将它当做其基类的对象对待。下图中,BirdController对象仅能处理泛化的Bird对象,而不了解它们的具体的类型,当move()方法被调用时,即便忽略Bird的具体类型,也会产生正确的行为。因为,编译器不可能产生传统意义上的函数调用。在非面向对象程序语言中,函数调用会引起所谓的前期绑定,也就是编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。在OOP中,采用后期绑定的机制,程序直到运行时才能够确定代码的地址。也就是,当向对象对象发送消息时,被调用的代码直到运行时才能确定。编译器只确保被调用方法的存在,并对调用参数和返回值执行类型检查,但并不知道将被执行的确定代码。

class BirdController {
    void  reLocate(Bird bird){
         bird.move();
    }
}
BirdController birdController=new BirdController();
Goose goose=new Goose();
Penguin penguin=new Penguin();
birdController.reLocate(goose);
birdController.reLocate(penguin);

  将导出类看做是它的基类的过程成为向上转型。

八、单根继承结构                                  

   在OOP中,除C++外,所有的类最终都继承自单一的基类——Object。因此所有对象都具有一个共用接口,所以他们归根到底都是相同的节本类型。

九、容器                                          

  如果不知道在解决某个特定问题时需要多少个对象,或者它们将存活多久,那么就可以使用容器来持有对其他对象的引用。不同的容器提供不同类型的接口和外部行为,不同的容器对于某些操作具有不同的效果。如ArrayList和LinkList,对于插入元素,LinkList明显花费的代价少。

十、对象的创建和生命期                          

  Java采用动态内存分配方式。对象的生成和销毁方式以及其生命周期,以后再做详细讨论。

posted @ 2014-09-25 11:36  冥草有心  阅读(285)  评论(0编辑  收藏  举报