关于面向对象

开通博客的缘由的根本原因在于希望找到一个平台可以记录自己工作学习过程中的所想所得,在写作的过程中可以总结自己的发现和观点,由于博客具有强大的开放性,还可以得到广大编程同行的意见分享和交流,共同进步;

直接原因是我工作的地方另一个小组来了一个很强的校招生tyd。和他闲聊了几次之后问他,你觉得写博客对你的提升大不大,他直言很大, 因为一开始是会很痛苦的,毕竟你看到的和你能真正写下来是完全不同的事情。

确实是这样,前段时间工作之余有空隙能够看一些基础的java源码,包括:Object,String,,包装类型,基本容器,基本并发类(Thread, Lock,Runable),Exception,Servlet等。这些都是很基础很直观的类,看的时候也是有所体悟的,但是现在要我说出来个123我还真的一时保护好直说,可能是囿于自己的理解程度和记忆深度不够和看的次数不够多。我相信如果看了一遍之后总结一下,应该会有所不同,如tyd所言,写程序嘛你看了总得输出一些什么,写写demo,做一下笔记和总结,应该是很有必要的。

这几天心里也一直有一个小灵感,一心想找个机会写下来,于是乎便在周六本打算加班的时候,立马来公司注册了账户开通了博客;

前几天抽空看了几页think in java,心里印象最深刻的是几个字,Booch对对象的一个总结:对象具有状态,行为,和标识。这句话简直是让我又恍然大悟的感觉,工作了这么久,接触了各种工具类,框架,中间件,动态代理等知识,其实这些东西都是逃不开对象和类的。当我在Struts2工程中茫茫然地搜寻一个个名字冗长的类名,方法名而晕头转向的过程中,早已经忘记了类最根本的功能了(描述该类对象所能具有的状态和行为)。

Booch的这句话其实是一个思想,很多时候是一个思路的切入点,而Booch以哲学的方式来概述了类和对象的内涵,应该是OOP中较为本质的思想了。而领悟这个思想其实有什么用呢?

之前我有参与过3个月的工程运维工作,就是我们的的平台给甲方用了,甲方在安装或者使用的过程中遇到了问题,而我们的现场技术支持和总部技术支持也解决不了的时候,就需要到我们研发这边来解决了,我们将这个工作称为“解决现场问题”。在解决问题的时候,有时候出现按照操作会得到许多奇怪的结果,在被各种催促的时候就会想wtf,为什么会这样。。。这个时候时间允许的话就可以在本地上找找相应操作涉及到的代码,看完代码之后往往会发现是本来逻辑就这样的,或者这段代码是被定制工作改动过的,遂能找到正解。

上述经历中如果我一味地茫然试错,埋头处理,可能会成功,但是总难以得出一个让人信服的理由。但是当看到代码之后,就能寻求到“真知”,这个就是视角的力量。站在更高的视角,就有机会看到更加本质的内容。

还有一次是最近的启动一个最新的版本的项目,启动的时候报错信息写的是由于logback引起的一个和webapp的神奇报错,找了半天没解决掉,最后找主管来他一看错误信息叫我换个tomcat。我仔细看了一下确实是tomcat报出来的错误,虽然换了tomcat之后没解决掉,但是在IDEA中找tomcat日志的时候发现了真正的错误根源。

这个事情也说了视角的道理,web应用是运行在tomcat容器里面的,tomcat报出来的错误,在webapp的debug输出页面怎么能够看到呢?如果一直不点开tomcat的日志,可能要找到猴年马月去,因此正确的视角才能看到正确的东西。高屋建瓴的视角一步一步下来也是有机会找到答案的,最怕的就是一直在一个黑盒里面找,就会成为井底之蛙。

在平时的工作中,作为一个java程序员, 我认为在看到庞杂的类和方法的时候,应该记住面向对象中对象的本质。一个类中的成员变量是为了表示可能出现的状态,而类中的方法是为了表述这个类的能力,不同的对象名可以作为对象的标识。知道了这些也很好理解一些相对抽象的概念了。

无状态:大概可以理解为状态不可变,那实际上就是形容对象中的成员变量,因此接口类,或者无成员变量的类,成员变量都是常数的类应该可以称为无状态了。

接口可以理解成为一种能力,实际上确实是不是实体,但是他也是客观存在的;

抽象类可以理解成更高级的抽象,因为具有描述了状态的能力,(具有成员变量);

还有许多面向对象的细节就不一一深究了,毕竟体系有点庞杂,完全不能保证正确性。

说了一下对象的本质是什么,那然后我们为什么要知道这个事情呢?

我觉得最直接的帮助就是可以帮助我们理解代码;

之前看java源码的时候,一两千行的接口或者类,就是直接从头撸到尾,包括注释,一行不落下。

这样有两个问题:1.容易忘记这个类的东西,没抓住主要矛盾;2.容易产生抗拒心理,看着看着就晕了压根不想往下看;

因此看到一个源码类的时候,我们不妨按照一些定式看:

1.先看类定义,可以知道这个类具有什么能力,继承了哪些类;

2.再看看成员变量,可以知道这个类有可能有什么状态,包含了哪些成员类;

3.看构造方法,可以大概知道这个类是怎么构造,怎么初始化的;

4.看关键方法,比如容器类的增删改查这种;

5.剩下的注意点包括:引的包,其他的一些非关键方法等;

其实,运行的java程序就像是另外一个次元世界,里面充满了各种对象,(就像地球中的各种事物),每个对象都是鲜活存在的;我们在开发工具调试的帮助下就像进入那个世界认识一个个朋友一样,可能和里面的关键角色搞熟了关系,就可以对那个世界拥有更大的掌控权了吧。

接下来的博客,我希望会主要分析一些我刚兴趣的源码,应该会很少介绍一些操作之类的东西,希望自己能够坚持写下去。

2018.9.9

猜你喜欢

转载自www.cnblogs.com/kobebyrant/p/gogogo.html