posts - 11,  comments - 18,  trackbacks - 0

  学java的人一定听过一句话,那就是万物皆对象,就像学C++的人一定经历过烫烫烫一样。。

  以下是个人对这句话的理解,如果有大拿发现偏差,欢迎指正;

  计算机专业出身的人应该都记得大学时有这么个经典的算法:电梯算法;之前写代码的时候,就是很简单粗暴的在一个文件里定义几个方法,然后一直对一个变量进行上上下下的操作,不止扩展性不好,而且现在看,很难用java的语言对理解它;其实万物皆对象的意思,是我们在编程考虑问题的时候,应该有这种思想:我要做的只有三件事,定义对象,定义对象的动作和定义对象的属性;比如电梯算法中,主要的对象是电梯,他的属性有楼层,目前所在的楼层,目前的动作状态,载重等,他的动作有开门,关门,响应,上下楼等;还可以定义一个人的对象,他的属性有身高(没必要),体重,姓名等,他的动作有摁电梯(向下摁和向上摁,有的电梯还可以直接摁楼层,这些可以通过堕胎方法进行扩展),一个简单的电梯算法应该就这两个对象,如果想扩展,可以有很多扩展的东西,比如电梯厂对象,电梯所在地址。面向对象最直观的的感觉就是可以对标现实,使用类现实的方法去考虑算法实现问题,比如人的动作(摁电梯),现实中他应该会怎么样?就是走到一个电梯门口,然后摁上或者摁下,摁的这个动作是人发起的,所以这个方法肯定应该在人这个对象里,因为人摁的是电梯的按键,需要电梯响应看,所以人的这个方法,需要传进来电梯对象,如下:

  public void upStairs(Elevator e){e.upStaris();}

  这算是现实,也是java世界里正常的思考逻辑:人是要摁电梯的,摁电梯是需要电梯对象的,摁电梯是要电梯响应的。

  以上是我对面向对象的一点粗浅的理解,想顺便聊一下程序设计里面的一个原则:依赖倒置原则;说人话就是不对其他具体对象产生依赖;这个好处在平时是体现不出来的,但是一旦有修改就能看出他的好处了;比如10年前,电梯只有两个动作,向上或者向下;但是5年前,突然出现一批可以直接摁具体楼层的电梯,电梯出现了第三个动作:向具体的楼层(toStairIndex(int i)),电梯厂紧急制作一批新电梯(NewElevator),人这个对象也需要修改,增加一个动作--直接想去i楼层;这时候就出现了问题:新电梯没法兼容旧的人对象,因为旧的人对象里只接收Elevator对象,所以整个一套系统就人为得分成两块:旧的人对象和旧的电梯一块,新的人对象和新的电梯一块,等着上帝(程序员)动大手术,把原有的人和电梯都改造,这就是电梯和人进行了强耦合,如果用接口就很简单了,比如人的摁电梯方法是这样的:

  public void upStairs(IElevator e){e.upStaris();}

  传进来的是个电梯接口,那新电梯改造,只需要继承IElevator接口即可;

  万物皆对象这句话,用程序来说就是java里面除了8种基本类型,其他全是object的子子孙孙,都可以用object的引用来指向他们;用生活的话来说就是程序里的代码,都可以用面向对象的思想来思考;聚个直观的例子,排序算法,其实也可以用面向对象的思维来编码:现实中有这么一个工具,他的属性是一个数组,他的动作有向上冒泡,向下冒泡等;然后实例化这个对象之后就可以使用他的冒泡动作进行排序了,但很少有人这么写代码。。其实面向对象思想现在提的已经不多了,个人认为主要是在解决问题的时候,很难碰到像电梯问题那样马上就能联想到现实的问题,也因为java的框架日新月异,比如jstorm,比如notty,包括最近在学习的flink,都已经没什么现实的影子了,现在更强调的是程序设计时候的六个原则,理解那六大原则要比理解面向对象思想靠谱得多;现在对面向对象,只需要知道在java的世界里,除了那8个基本类型,其他所有的所有,都是Object的子类,都有Object的属性和方法,这就够了。

  综上:现实解决问题,设计代码的时候,如果能从现实中找到对标更好,比如我要实现一个动物,或者实现一个电梯(不得不吐槽,现在很多网上或书上的例子都用很容易在现实中找到的例子,比如鸟接口要有fly方法,什么动物接口要有eat方法。。   但是真的解决问题的时候,不会让你这么容易找到在现实中就有的例子),很多时候,我们要实现的是只有计算机世界才存在的东西,很难用现实的事物去抽象,比如我要实现一个接口,对输入进行校验,如果符合我的规则,就返回true,现实是没有对标的,那就用那六个设计原则(还是重在理解),比如单一职责原则,我的接口只做一件事,或者一类事,而不用去死扣我设计的应该是个什么对象,这个对象在现实里应该是什么。

  在java中,Object还是很重要的,接下来我也会重点聊一下Object对象,他的内存结构,他的内存位置,他的几个方法,他的作用等等等等一切我所知道的Object;

posted on 2019-03-25 21:01 野原小心 阅读(...) 评论(...) 编辑 收藏