一名苦逼程序员的thinking in java 之路

12年前
    这篇文章是阅读完了thinking in java的第一章做的非总结性的总结随笔. 希望对某些人有所帮助.

      首先有必要说一个本人的背景,本人是一只非计算机专业出身,在计算机行业苦逼了2年的苦逼程序猿,弱势群体?

      Thinking in java这本书我压根就没想过会看它, 纳尼? 太特么厚了... 不知道那天怎么的心血来潮的就翻了翻,就不小心翻了一章.

      看完我就想尽量写点什么,通俗易懂的,省着时间长了,自己很多东西忘了,还能找点东西看看. 为什么不翻书看?  答曰:老外那语法实在不敢恭维啊!(可能是翻译的事,大牛建议看English版).

      好了,闲话不多说了,Let's go!

      第一章建议新手最好还是别看了, 当然了作者也是这么建议的(那你还写在第一章). 不过可以看看第一章最后的总结,里面说的一句话我感觉还是挺坦诚的.大体意思就是 "选好你自己的路(深思熟虑),再去选择语言,没有必要非得去学习java" , 中国的一句老话"谋而后动" 就是这个道理.

      记得千万要深思熟虑. 本人就是因为干了一年java,右"转行"做了一年前端,导致薪水一直止步不前.

------ 正文传送门 -----

1. 抽象过程

       抽象在某种意义上讲就是"想象"(当然要合理). 从 "抽象"<---->"具体"    就产生里面向对象语言了.   举个例子来说:

       'A&V女U' < --- >  '苍老师'   (这就是一个抽象到具体的概念了.)

       而什么是对象呢? 当然了,不是你女/男朋友, '苍老师'就是对象,就是所谓的'具体'.

       而什么是类呢? 必须就是 'A&V女U'....

       所以,对男同胞而言,  我们喜欢的是'类'(包括好多个对象,对象多了多好啊! 你懂得.);

       类是封装性的表现,对象是封装性的具体实现!

2. 聊一聊关于类即Class吧!

       我以前一直有一个困扰. Class 为什么是数据类型?

       以前我总是想,类,类,里面有好多属性,好多方法,属性有int 类型,String 类型, boolean 类型. 这么多类型,那怎么Class还是数据类型呢?  现在我懂了,都是骗子,想类的时候,什么都不要想,我就问你,int b = 1, 说明的b 是int 类型.  boolean flag = false,说明flag是boolean类型. 那Class cl,不就说明cl是Class类型的吗. 那Class不是数据类型是什么.千万别被类里面的乱七八糟的东西干扰了.

3. 每个对象都提供服务

      我感觉这个问题再好理解不过了. '苍老师'不就为广大的宅男同志提供服务嘛,所以说对象肯定是为我们服务的,所以,你需要什么样的服务,就是创建什么样 的对象,当然了,首先你得确保你找到了正确的类(你不能找 '程序猿类' ---> '苍老师' 吧!)

4. 说说可视范围吧

    public(都能访问到) > propected(继承关系 可访问) > default(本包 可以访) > private(谁也访问不到) .

    通常新手都喜欢用public ,编译不容易出错嘛! 不过切记,要根据具体的需求去用, 编译报错你还可以去modify ,运行时出问题,你就傻眼了.

5. 封装 继承 多态

    封装上面已经提了,这里就不说了.继承和多态是老生常谈的问题了. 因为本人也不敢说完全理解了继承和多态.所以从新人的角度分析分析.

    曾经有一次面试,有这么一个问题, 让我说说类和接口的区别?  我当时回答的乱78遭的引来了面试官的强烈BS!

    先说说我此时的想法吧!  先说说抽象的东西吧!

    (1) 类提供的是服务(对象嘛! 还记得不!)  接口提供的是一组标准.(一组当然就是相关的东西了)

    (2) 一个类只能继承一个类,却可是实现多个接口.

    (3)类中的服务(方法)是实现的(当然也可以不实现,加abstract去修饰方法,这种情况的类 叫做抽象类),接口中的方法一定不能实现(当然 如何你用Eclipse IDE的话,是会提示编译错误的).

    当然了,以上都是写书面的东西,不知道为什么面试者就爱问这些东西.

    说说工作中的体会吧. 继承一般是用来"建模"的. 什么是建模?

    建模就是建立类与类之间关系的, 也就是几个类之间的继承关系.建模好坏直接影响你的编码水平,有时候我就感觉,建模更像是设计.不是你写了个extends,扩展了一些东西就OK的.有 时候更需要一些经验的.说实在的,我现在用到继承很少,其一是公司的系统建模架构师基本都搭建好了,你只要添加逻辑就OK,另一方面也许是自己的功力还不 到家吧!

 

 

     如图就是一组建立好的模型,一层一层的.看着多清晰啊.

 

     说的可能有点严重了,其实大可不怕,不能在工作中用,我自己练手还不行吗,继承随便用,多用用就知道怎么设计更好了. 不过所说的多用,不是说不经大脑的就乱用,要思考,总结,不然永远只是个猿崽子.

     继承就说道这吧, 当然了,多态也建立在继承的基础之上的.

     编程的时候,经常想把一个对象不当它所属的特定类型来对待,而是将其当做基类的对象来对待. 这句是书上原话 .

     什么意思呢.我写一段代码阐述一下吧!

    

public class PolymorphismTest {      public static void main(String[] args) {          Bird bird = new SpringCuckoo();          callFly(bird);      }             public static void callFly(Bird whickBird/*就写了Bird 就是所谓的基类*/) {          whickBird.fly();      }  }     /**   *SpringCuckoo 春娟 ,杜鹃的一种   *   */  class SpringCuckoo extends Cuckoo{             public void fly() {          System.out.println("*** Spring Cuckoo **** 正在飞....");      }  }     /**   *Cuckoo 是布谷鸟就是杜鹃   *   */  class Cuckoo extends Bird {      public void fly() {          System.out.println("22222222222");      }  }        /**   *Bird是鸟   *   */  class Bird {      public void fly() {          System.out.println("111111111111111");      }  }


 首先看一下他们之间的层次关系吧! 如下图.

  一般我就是这么用多态的... 就是参数直接写成父类的. 然后其实new的时候是子类的,就可以调用子类的方法了.可能理解的不透彻,希望大牛们能帮着指点一下.

 

 

 6.关于创建对象中的内存体现

   java中new对象是动态的,什么是动态的呢?  就是对象是在程序运行时才知道创建哪些对象,然后开辟相应的内存空间存放这些对象(这些都是在内存里的heap中完成的,heap),而像C++ 是在程序编译的时候就知道要创建哪些类,然后可能是在内存中穿件了一个类似于表似的东西记录下来(存放在内存的Stack区),然后在运行的时候在开辟出 相应的空间.我个人是这么理解的.

  C++: 1. 记录对象表(编译时)  2. 开辟空间(运行时)

  Java:  1. 记录对象表 ,开辟空间(运行时)

    从以上可以看出 在运行阶段 Java要比C++多干一件事, 所以要比C++慢一些(当然是对计算机来说). 不过对于现在越来越宽裕的内存来说,我不知道这种差异到底有多大. 

 

     希望写的东西能给大家一些启发,也欢迎大家指出我的错误.

转自:http://www.cnblogs.com/gnface/archive/2012/06/13/2547122.html