12 评论

Java 新手的通病[2]:缺乏面向对象的基本功

  按理说 Java 是一个很 OO 的语言,Java 社区也一向是充满了“对象”的氛围。但俺在面试 Java 程序员时,却屡屡碰到令人大跌眼镜的事情。俺碰到不止一个求职者,连什么是“多态”都讲不清楚。很多人号称用过设计模式,但一半以上都仅限于单键模式和抽象工厂模式。当我深入问他/她抽象工厂模式到底有什么好处时,很多人语焉不详。

  为什么很多 Java 程序员会缺乏面向对象基本功?这得怪那些 Java 框架。现在 Java 的各种框架太发达、太傻瓜化了,导致很多程序员只需要按部就班、照着框架进行代码填空,基本已经丧失了 OOA 和 OOD 的能力。我手下有些个 Java 程序员,对 Spring、Hibernate 等框架了如指掌;但如果给他一个简单需求,让他写一个脱离 Web 框架的独立 Application,他就不知所措了。这样的开发人员,将来只能成为所谓的“软件蓝领”,岗位很难得到提升。

  同上一个帖子一样,我这次也提如下几个问题:
★基于接口的继承和基于实现的继承各有什么优缺点?
★继承(包括 extend 和 implement)有什么【缺点】?
★多态(polymorphism)有什么【缺点】?
★为什么 Java 可以多继承 interface,而不可以多继承 class?
★假如让你写一个小游戏(比如人机对战的五子棋),你会如何设计类结构?
★类结构设计时,如何考虑可扩展性?

  如果上述这些问题你都能够搞得比较清楚,说明你的 OO 基础还过得去。否则的话,我建议你一边找些 OOAD 和设计模式的书看看,同时自己动手写些简单的小程序(不依赖那些框架),把学到的模式理论结合到实践中。通过这种方式来提高自己 OOAD 的能力,效果会比较好。

  后面来聊一下第3个通病:缺少良好的编程习惯
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想和本文原始地址:
https://program-think.blogspot.com/2009/01/defect-of-java-beginner-2-oo.html

12 条评论

  1. 说的真好!java是面向对象的语言,主要是面对接口编程。用面向对象的思想写出来的程序,会与面向过程写出来的程序会有所不同,因此不懂面向对象编程的人,无论写什么代码,看起来就像面向过程的。

    回复删除
  2. 楼上说的对,首先要有编程思想。缺乏思想,再好的语言也写不出好的程序

    回复删除
  3. 刚才用gogole搜索了一遍没发现有什么说【多态的缺点的文章】,也许我搜索技巧不得当.博主能否回复一下?多谢.

    回复删除
  4. 楼上的同学,
    关于多态的缺点,我简单提一下:比如性能问题(这个比较轻微);比如在“实现继承”中的多态,可能会附带有继承的缺点。

    回复删除
    回复
    1. 看到又有同学问此问题,再补充一下:
      要实现代码复用,可以通过继承(实现继承),也可以通过包含。
      而实现继承是静态的(大部分语言,无法在运行时修改继承关系);
      而包含是动态的,可以在运行时修改包含关系。
      这是“继承”的缺点之一。

      删除
  5. 确实啊 代码填空啊

    回复删除
  6. 博主能否推荐几本适合刚入门的新手看得书籍呢?

    回复删除
  7.   ★继承(包括extend和implement)有什么缺点?
      ★多态(polymorphism)有什么缺点?
    To be honest, I cannot see there is any shortcomings in inheritance and polymorphism. Maybe there are practical problems out there, but that's all because one uses inheritance when he shouldn't. Or you can just say the shortcoming for inheritance is it cannot stop one using it when he actually shouldn't. No violation to the rule "composition over inheritance" means no shortcomings for inheritance.

    回复删除
  8. 多态应该没什么缺点。有缺点的是继承。有句话是prefer Aggregation/Composition over inheritance。 具体实例是:因为继承树不仅可以竖向扩展,还会出现横向扩展的情况,甚至还会出现往与其它维垂直方向的第三维,第四维...第n维方向扩展。所以如果用继承则会造成hierarchy的臃肿。不恰当的比方是:
    House DogHouse CatHouse WoodenDogHouse WoodenCatHouse RockDogHouse RockCatHouse
    ... WoodenCatHouseForWindows WoodenDogHouseForMac ...

    回复删除
  9. 干了两年 就是代码填空,按博主这么说,我是很悲催啊,还想跳槽去上海,可怎么办。唉

    回复删除