Java 如何处理好方法(函数)与类的关系? 回答全部奖励,谢谢! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
anonymoustian
V2EX    Java

Java 如何处理好方法(函数)与类的关系? 回答全部奖励,谢谢!

  •  
  •   anonymoustian 2016-01-06 09:16:52 +08:00 2986 次点击
    这是一个创建于 3638 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这样,我之前对面向对象的语言一直有这个疑惑。

    比如我要开发一个计算器,那么我用 C 语言写的话那我就会定义 很多函数, 比如 add 、 sub 等等。

    但是 java 的话因为引入了面向对象的机制,我 就不太懂什么时候应该用类、什么时候应该用方法,也就是我应该如何组织呢? 谢谢!

    10 条回复    2016-01-07 06:39:09 +08:00
    xylophone21
        1
    xylophone21  
       2016-01-06 09:24:10 +08:00   3
    基本上,最简单的方法

    C header file ==> class
    C api ==> public method
    czheo
        2
    czheo  
       2016-01-06 09:28:25 +08:00   1
    1F 的总结不错。怕 lz 理解不到那个份儿上。
    BTW, Java 是非常偏激的语言,做什么事情都用 class 。
    liuxey
        3
    liuxey  
       2016-01-06 09:32:51 +08:00   1
    Java 中任何对象和数据都要由类为载体,当然枚举其实也是类,了解这个后就可以开始了:
    先写一个 Caculate 类,里面实现+-*/等计算逻辑,还有一些高级运算
    再写一个 Caculator 类,作为计算器的主体,其中有一个私有变量 Caculate 的实例,
    Caculator 的接受外部的各种输入,最后调用 Caculate 实例的计算方法,最后输出

    这是简单的做法,想要很彻底的面向对象来实现,这还不够
    thinkmore
        4
    thinkmore  
       2016-01-06 09:53:08 +08:00   1
    java 写一个计算机只需要用到少量的数据结构知识,比如说 statck 或者说 tree,所以写一个方法就可以搞定。至于说使用类的话,一个类需要有什么属性,你觉得你的计算机哪些是共有的,提出来就好了,等你写好了优化就行
    1000copy
        5
    1000copy  
       2016-01-06 10:13:57 +08:00   1
    类就是一个外套,把你原来的方法和全局变量外边套上就可以。比如
    原来你写的计算器:
    int lastvalue = 0
    add()
    dec()

    现在要做的就是套上{},加个类名
    class WOkao{

    int lastvalue = 0
    add()
    dec()

    }

    这就是类了。

    好处就是全局变量没有了,内部化了。

    用的时候,稍微麻烦就是得实例化。要 new 。之后就一回事。

    做到这步,你就是封装了。了解这个是了解继承,多态的基础。
    asj
        6
    asj  
       2016-01-06 10:18:37 +08:00   2
    从需求开始,需求里的名词就是一个候选的类。然后把动作围绕名词放好,这些是候选的类的方法。
    以你举的例子,名词计算器可能就是一个类,加减之类的动作是它的方法。
    进一步引申的话,假设要实现的是一个实体的计算器,那种摆在桌上按按钮,有个液晶屏的那种。
    你会发现因为有状态,比如按了按钮 2 以后,如果前面按的是 1 ,显示 12 。如果前面按的是 1 +,显示 2 。结果和前面按的按钮有关,这种情况下用 C 风格的代码写就会相当不自然。
    如果用面向对象方式,“计算器”是一个类,“按按钮”是它的一个方法。“按钮”也是一个类,它会作为按按钮的参数传给计算器。每次方法操作后,计算器的状态变化,记录在它的内部。通过“显示”方法把当前状态输出出来。
    进一步复杂化的话,比如要代码控制液晶屏上的灯,每个数字由 8 个灯组成。那么“液晶屏”是一个类,有“显示数字”方法。计算器调用这个方法把要显示的结果传入即可。
    这样虽然整体的复杂度提高了。但是显示的逻辑并不会影响到计算器的逻辑,因为两个类担负了不同的职责。只要它们之间的接口没有改变,一方内部的复杂度不会传染到另一部分。
    icegreen
        7
    icegreen  
       2016-01-06 11:22:53 +08:00   1
    我一般划分类的思路:
    1. 从逻辑上,或者根据表结构把一类东西封装成一个类;
    2. 如果一个类方法太多可以考虑是不是可以细化拆分,是不是类划分不合理;
    3. 判断类划分是否合理还可以看方法传入的参数; 有时候方法是可以变成参数类的成员函数的;
    Dwayne
        8
    Dwayne  
       2016-01-06 19:20:37 +08:00   1
    是不是该建议楼主看设计模式
    WispZhan
        9
    WispZhan  
       2016-01-06 23:34:57 +08:00   1
    @Dwayne 看来楼主根本没到那个地步,应该先看,面向对象编程。推荐 《 Head First 面向对象分析与设计》
    -----------------------------

    另外别乱推荐新手来“设计模式”,基本上开始就是生搬硬套,估计到时候在你项目组里出现 你就哭吧。

    首先要知道 OOP,然后才设计模式。连面向对象的几个设计法则都弄不明白,也是能硬套设计模式,到时候就是不伦不类。
    wizardforcel
        10
    wizardforcel  
       2016-01-07 06:39:09 +08:00 via Android   1
    把你的 struct 变成类 struct 的配套函数 放头文件里的写成 public 静态的写成 private

    另外没有必要为了 oo 而 oo ,功能性的函数直接写成静态的就好了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1117 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:04 PVG 02:04 LAX 10:04 JFK 13:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86