我今日来在为"面向对象"编程思想苦恼 我的脑子真的转不过来     每次老师说要我们分析出一个系统所涉及到的"类"我就头疼,不是写差了,就是对系统的"类"还没想全 ,不要误会 这里的     全是说比较满意  就是总体不满意 不是方法不合理就是不理解他们之间的关系  譬如:  我举个例子     1.  打印机和纸 中就有个 "写字的方法" 这个方法是纸的方法还是打印机的方法
  
     2. 人走到门边 去关门   "关门的方法"  这个方法是写在门类  还是人类中
 
     3. 坦克 打击了 一辆坦克  判断有没有击毙  这个 "判断击毙的方法" 是坦克的方法吗     4. 一个人拿着两块石头要磨出石刀    请问这个 "磨的方法" 是人的方法还是石刀的方法    
     还有很多很多 很复杂的都有      我不是说为这几个问题就苦恼 我是说有时脑子真的会越来越混 遇到这些问题老是有点靠 "蒙"    希望大家给我一个 一击致命 的  说法  让我能真正理解 我有看面向对象的书    说实在的  面向对象就像个美女  把男人迷了又迷   我真不知到什么时候我才能清醒

解决方案 »

  1.   

    从 人 认识 事物方法 去认识 object
      

  2.   

    你用数据库的眼光去考虑就简单了,每个类都是一个表格,描述类的属性都应该成为表格里的列。然后从现实中看其功能:1 打印机和纸,打印机打字,纸上显示字,所以就应该在打印机中有个“打字”的功能,纸里有一个“字”的属性,数据库里“纸”这个表里就会有一个“字”的列来存储纸上的字2 人关门,人有动作“关门”,门有状态“开/关”,所以人有个“关门”功能,门有属性“开/关”,数据库里门这个表就应该有个boolean列,是开还是关3 坦克打坦克,坦克有功能“攻击”,坦克还有状态“死/活”,所以坦克既要有“攻击”的功能,在“坦克”表格里也要有列来表示是死是活4 人磨刀。人能“磨”,石头能变成不同的物品,所以石头应该有属性“形状”,数据库里存储形状这个属性,所以有个“形状”列你的例子里把施动者和被动者分开想想。1 如果单纯是一个”纸“类,谁会知道上面的”字“是”打“出来,还是”写“出来,还是”印“出来?所以纸不是施动者2 只是”门“类,谁知道这个门是怎么关上的?是风吹的,是人关的,还是被路过的狗狗碰的?同理可证所有对象,动作在施动者里,受动后的状态在被动者,这是一个基本原则。不要把问题想得太复杂,“抓贼,有时候就这么简单”
      

  3.   

    敢问楼主接触java有多久了
    别急吗,慢慢来
    学的多了,练的多了
    你自然就明白了你现在需要大量实践
    等到从量变转为质变得时候,你就不会来问这个问题了
    呵呵
      

  4.   

    17楼的解释不错,楼主不要太钻牛角尖了,java还有好多东西要你学呢
      

  5.   

    面向对象的思想:继承 封装 多态
     
    继承 口语化表述就是 当你诺基亚的老型号手机已经无法满足你了,你就要换一个新的诺基亚手机 但是老的功能还是沿用了,或者给这个老的功能更加的强化了 称之为重写。这个就是继承的重点子类继承父类,重写父类的方法封装 这个就比较简单了 你的新的诺基亚手机内部构造你会了解么?不可能 人家把它给封装了~~把“手机”看做一个类 很抽象 不是具体到哪一个手机,但是你买的那个就是一个实例(对象)。“你买的诺基亚手机”就是这个实例(对象)。里面封装的信息(零件)你无法看到,这个就是封装 同时也应该理解什么叫面向对象了吧?定义一个抽象定义“手机” 实例化一个对象 “诺基亚手机”多态 就是你爸爸帮你做JAVA作业 如果你已经理解上面我说的那个面向对象的思想话  那么我这句话你就能理解了 父类引用指向子类对象。 Persion p = new Student(); Student类是Persion的子类 学生也是人。所以学生继承了人这个类。p是父类引用,new Student()会生成一个子类对象。就是p指向new Student()这个对象 通过p我们可以调用student()对象中的属性。希望我的解释可以让你明白!
      

  6.   

    1.  打印机和纸 中就有个 "写字的方法" 这个方法是纸的方法还是打印机的方法 //显然应该是打印机的方法,字作为参数传到打印机这个对象中,然后才能执行打印。
      
        2. 人走到门边 去关门  "关门的方法"  这个方法是写在门类  还是人类中 //应该是门自己的方法,因为如果关门是人的方法的话,那么人是不是活着有点累?联想开来,门是不是还有判断自身状态的方法,比如isOpened();isClosed()等等    3. 坦克 打击了 一辆坦克  判断有没有击毙  这个 "判断击毙的方法" 是坦克的方法吗 //跟上面门一样,应该是坦克这个类提供这样的方法,不然,难道又要人去判断吗?想累死人吗?    4. 一个人拿着两块石头要磨出石刀    请问这个 "磨的方法" 是人的方法还是石刀的方法//同样的道理,磨刀应该是刀的方法,哎!你们老师真会举例子,全是人和万事万物的例子...
    其实,这些例子表明了面向对象的一个基本概念——封装。也就是说一个类,前提是这个类的功能已经完整的实现了,那么在这样一种情况下,你可以通过类的方法来了解和操作这个类的实例化对象。结合上面一个例子吧,比如说门,有一个类叫Door,那么我实例化一个门,也就是:Door door = new Door(); 那么通过door这个对象,我能知道它的一切,比如长宽高,比如是否关了,我还能操作这个门,比如关门,开门。不知道你懂了吗?
      

  7.   

    用英语的最简单的语法来分析吧:主+谓+宾
    其中 主和 宾 是名词,把他抽象成类  谓 可以分析成动词。  那么谓 肯定是 主 施出来的,故谓应该是 主这个类的方法。再扩展 谓 到 一个形容词或一个表状态的词,也就是宾 的成员变量了。
    如: “打印机 在纸上 打 字”分析成 “打印机 打字 到纸上” 打印机是 主, 纸是 宾, 打字是 谓。
    所以 打字是 打印机的方法,即有print()方法。同时,当打印机在纸上打字完后,纸也要有个打上了字的状态量,即 纸这个类有个isprint 变量。
    同理分析下面的。(当然上面的语法在面对具体情况时要扩展下下)
      

  8.   

    我也很喜欢Kobe,买了他的比赛服,超帅,哈哈按理说,应该是这么理解吧。类就是封装的载体,载的就是方法和属性。所以什么样的类就应该提供什么样的方法和属性。如果人这个类里有门的方法,这叫不良封装,这样会破坏各个类的结构和独立性。
      

  9.   

    每一个对象有自己的属性 和方法,你弄清楚 自己要得到什么结果 再去分析如何设计一个类比如 :打印机在纸上打印字,那么 建立一个打印机对象,再调用打印机的打印方法
          在打印方法的定义中,还要传入一个纸对象作为参数,然后调用纸的draw()方法,把结果打印在纸上。
    这其实和现实生活中是一样的,把这些分解开看,它的实质其实很简单!
      

  10.   

    new一个对像出来就是面向对象。通过new出来的这个对象去操作类里的各种属性。多简单你还是别学了。
    (生气吧,哈哈,故意气你,看你开不开窍!)
      

  11.   

       现实世界中的事物都是很复杂的,他们的属性也多得数不清,而程序能做的就是模拟出其中对你有用的那一部分属性。要是考虑得太全面的话,你加一千个成员变量都不够用。
       既然是模拟现实事物,一些常识问题必须弄清楚。
       比如你说的第一个例子:“写字的方法”,这当然是人类才拥有的能力。而打印机的功能只是接收一个输入,然后把信息输出到纸上。从编程的角度考虑,如果把纸当成一个商品,我们所在意的是它的尺寸,它的价格,它的生产地,它的质量(quality);如果把它当成显示信息的工具,那么首先要考虑的是它的尺寸问题。
       而第三个例子:从击毙方面考虑,你可以给坦克设置一个状态属性,要么被击毙,要么完好无损,还有可能只受了点轻微损伤,这样只要查询一个坦克的这个状态属性就可断定它是否被灭了;还可以给坦克分配一个功绩表,表中记录它目前共击毙了多少坦克,分别是那几辆。
       所以怎样给一个类分配属性,要看具体的需要。
      

  12.   

    在真正的系统中,我管它这个方法是谁的,通通属于业务类,放在业务层。
    不用费多大脑子,实体类都是POJO。
    搞定。
      

  13.   

    你可以把关门这个作为一个行为放在人类里,接受一个door为参数,你也可以在door类里写一个无参的CloseDoor方法,面向对象思想嘛,你觉得怎么更贴近人的思维就行了,不用像背书一样哪个方法必须写在哪个类里(只要不要在逻辑上太离谱)
      

  14.   

      其实这问题也一直困扰着我,后来我就没再想那么多,直接去实践,你会绝的这东西没有一个绝对,只有一个相对,相对你要做的这个项目所涉及到的业务,当然在你做项目的时候有时就会觉得某个方法应该不能放在某个类里面,应该放在其他的类里面比较合适,这是经常有的事,这样你慢慢就能分析的清楚.  听我老师说 .net框架也是这样 1.0 到2.0  里面有些类 也是被改成接口 ,连微软的人都有觉得不合适就改,这就是经验,慢慢来吧
      

  15.   

    从“主动”与“被动”的角度考虑,也许能让问题稍微清晰一些吧?譬如:
     
       1.  打印机和纸 中就有个 "写字的方法" 这个方法是纸的方法还是打印机的方法
           打印的时候,是打印机“往”纸上打印,显然打印机是主动吧,那么“打印”这个及物动词明明的
           方法是不是应该写在打印机类里比较合理呢?
        2. 人走到门边 去关门  "关门的方法"  这个方法是写在门类  还是人类中
           同上,“人”把“门”关上,而不是“门”让“人”把自己关上,那么人是主动方,门是被动方,
           “关门”当然也应该是“人”的方法而不是“门”的。
        3. 坦克 打击了 一辆坦克  判断有没有击毙  这个 "判断击毙的方法" 是坦克的方法吗
           这个就不是那么绝对了,比如你老师所说的方法是说的通的。另外,判断击中同样也可以是坦克
           自己的方法(只要“坦克”这个类里定义了“是否被击中”的flag)
        4. 一个人拿着两块石头要磨出石刀    请问这个 "磨的方法" 是人的方法还是石刀的方法 
           这个用以上思考方法去想的话,“磨”自然是人的方法才比较合理。3楼说得很好,应该用人理解自然界的方法去理解面向对象。“世间万物皆对象”对于初学者来说,这简单的一句话似乎也帮不上太多忙,多看,多学,多想,很快你会理解这简单一句话的博大精深的。
      

  16.   

    还是从生活开始吧!!!看到什么东西都联想一下它能做什么,能被做什么?个人理解,其实我也刚开始学java
      

  17.   

    万物皆对象
    都有属性和方法动物狗 extends 动物
    杂种狗 extends 狗动物 小黄 =new 杂种狗();
      

  18.   

    介绍一本书给你,可能对你有所帮助的  《JAVA完全手册》内容很详细,留个连接,你可以去看看http://bbs.tsp2c.cn/?fromuid=136