日积跬步01

    最近有一段时间比较空闲,整理了半年多来的工作,规划规划以后的方向……从《Thingking in Java》开始

    感谢IT的妹纸们,帮我省去安装Java开发环境麻烦,Java -version看看:

  编程环境:Ubuntu SMP  x86_64 GNU/Linux  java 1.6

  参考书:《Thinking in Java》pdf 及其源码

===============================================================================

   理清一些基本概念:

   JDK:Java development toolkit,相当于Java的库函数,是编译、运行java程序的工具包;

   Java2平台包括:标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本

   J2SE:Java2 standard edition,java2标准版,主要用于桌面应用软件的编程,包含构成Java语言核心的类:如数据库接口定义、接口定义、IO、网络编程等;

   J2SE:Java2 enterprise edition,java2企业版,是J2SE在企业应用需求上扩张,语法仍然是以J2SE为基础,通过添加新的API、框架技术实现大规模、高复杂度的企业级项目;

  J2ME:Java2 Micro Edition,主要用于嵌入式系统开发,如手机、PDA编程。注意这里的手机是指Android智能机之前的手机,Android开发并不是J2me,Android是开发方向,J2me是语言,Android支持的java原类库比J2me要丰富。

===============================================================================

重要的思想:

   1.对象的接口(Interface):通过接口向对象发出请求(完成一次交易、在屏幕上画一些东西等),对象的“类型”或“类”规定了接口的形式;

   2.实现方案的隐藏:“类创建者”构建一个类,并提供接口给“客户程序”,其他细节可以隐藏。这种隐藏机制好处是:客户程序员无法接触和改变细节;实际上就是访问控制,两方面原因促进这种机制:一是防止客户程序员接触内部数据,二是方便库设计人员修改内部结构,而不用担心对客户程序造成影响,客户程序只需重新链接一下即可。

   3.方案的重复使用:“一辆车包含了一个变速箱”,“创建一个成员对象”,即将一个类对象置入一个新类,新类“成员对象”通常设为“private”,客户程序不能访问,这样可在不干扰客户代码的前提下,从容修改那些成员,甚至在“运行期”更改成员。而“继承”并不具备这种灵活性,因为编译器必须对继承的类加以限制。

   4.继承-重新使用接口:关键字extends,新类不仅包含父类的所有成员,更重要的是复制了父类的所有接口;这意味着给基础类(父类)对象发送的所有(请求)消息也可原样发给衍生类(子类)的对象;

   那么关键问题来了,对象收到一条请求消息,又是如何区分衍生类和原来的基础类?两种办法:第一种是为衍生类添加新功能的方法;第二是“改善”原基础类的函数定义;圣经中给出了绕口的两个概念:“等价”和“类似",“圆就是一种几何形状”,子类对象完全可以“纯替换”成父类对象,指的就是是等价关系;但是这种替换是不完美的,因为不能在父类对象里访问新定义的函数,这里说的就是类似关系。

  5.多形(多态)对象的互换使用:“Upcasting”,翻译成“上溯造型”,表示从上面继承下来,基础类位于顶部,而衍生类在下方展开。

  如果用java写这样函数:

  void doStuff(Shape s) {
  s.erase();
  // ...
  s.draw();
  }

  如果在其他程序中使用doStuff函数:

  Circle c = new Circle();
  Triangle t = new Triangle();
  Line l = new Line();
  doStuff(c);
  doStuff(t);
  doStuff(l);

   非常重要的编程技巧:doStuff(c);一个Circle(圆)句柄传递给本来期待Shape(形状)句柄的函数,因为“圆就是一种几何形状”,凡是doStuff()函数能发给Shape的请求消息,Circle同样能接收。这种把衍生类对象当作原基础类型处理的过程叫做“Upcasting”(上溯造型)。

  doStuff()里代码:

   s.erase();
  // ...
  s.draw();

   注意这里并没有表达:“如果你是一个Circle,就这样做,如果你是一个Square,就那样做,等等”,编译器并不会检查一个Shape所有可能的类型,应该是这样的表达:“你是一种几何形状,我知道你能将自己删掉,erase();请自己采取行动,并自己去控制所有细节吧”。

***动态绑定***

     为Circle调用draw()时执行的代码和一个Square或Line调用的draw()时执行的代码是不同的,但当把draw()消息发送给一个匿名shape时,根据shape句柄连接的实际类型,会自动采取准确类型的操作。总结一下,将一条消息发送给对象,如果并不知道对方的具体类型是什么,但采取的行动同样正确,这种情况就是“多态性”(Polymorphism)。C++中需要使用关键字virtual。

***抽象基础类和接口***

    关键字abstract,程序设计时,经常希望基础类只给衍生类提供一个接口,不想任何人实际创建基础类的对象,只需要上溯造型。使用关键字abstract限制,编译器会阻止创建类对象。

 

posted @ 2016-10-26 17:30  A.ArmStrong  阅读(132)  评论(0编辑  收藏  举报