V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
palmers
V2EX  ›  程序员

请问 java 中的`static` 方法是否违背了 java 一切皆对象的说法?

  •  
  •   palmers · 2016-11-10 15:26:10 +08:00 · 3642 次点击
    这是一个创建于 2939 天前的主题,其中的信息可能已经有所发展或是发生改变。

    按照 java 的哲学,一切皆对象, 所有成员应该都会有一个对象作为挂载点,但是static修饰的成员是否违背这一哲学或者原则?

    25 条回复    2016-11-14 18:21:51 +08:00
    FrankFang128
        1
    FrankFang128  
       2016-11-10 15:37:45 +08:00 via Android   ❤️ 1
    Class 也是对象
    WhyAreYouSoSad
        2
    WhyAreYouSoSad  
       2016-11-10 15:41:38 +08:00
    一切对象也可以共享某个类别里面的固定资源啊,好比现实世界的各个领域,范围的公共资源。
    mooncakejs
        3
    mooncakejs  
       2016-11-10 15:49:26 +08:00
    1 楼说得对, class 本身就是对象,你可以理解成 static 属性其实是 Class 的成员, Class 由 java 负责生成单例
    itqls
        4
    itqls  
       2016-11-10 15:53:25 +08:00
    类对象
    wikimore
        5
    wikimore  
       2016-11-10 16:05:11 +08:00
    static 是面向过程专用,比如一些 Utils ,违背了面向对象,但是不违背一切皆对象吧?
    pangliang
        6
    pangliang  
       2016-11-10 16:27:13 +08:00
    char int byte 就不是对象
    misaka19000
        7
    misaka19000  
       2016-11-10 16:38:05 +08:00
    Java 中(几乎)一切都是对象。《 Thinging In Java 》
    misaka19000
        8
    misaka19000  
       2016-11-10 16:38:48 +08:00
    靠, thinking 拼错了
    aristotll
        9
    aristotll  
       2016-11-10 16:53:44 +08:00
    有 primitive 类型的

    为了提高性能

    只是现在 autoboxing 让这种差别在写的时候小了起来
    incompatible
        10
    incompatible  
       2016-11-10 16:58:08 +08:00
    楼主可以试着写一段代码通过反射去调用一个 static 方法。
    当你调用 Method.invoke(target, args)时,要把该 static 方法所属的 Class 对象作为 target 传入的。
    Which means, static method 是以 Class 对象作为你所说的挂载点的。
    imcxy
        11
    imcxy  
       2016-11-10 17:05:08 +08:00
    哲学,你太较真了。
    cheneydog
        12
    cheneydog  
       2016-11-10 17:07:26 +08:00
    怎么好用怎么来,何必追求理论上的完美,现实中总是这样妥协,又那样妥协。
    Chrisplus
        13
    Chrisplus  
       2016-11-10 17:17:16 +08:00
    不违背一切皆对象(但是有违背的)
    jason19659
        14
    jason19659  
       2016-11-10 17:18:42 +08:00
    有基本类型就已经违背了
    xingda920813
        15
    xingda920813  
       2016-11-10 18:02:46 +08:00
    @incompatible 静态方法 Method.invoke(target, args) 中的 target 传入 null 即可。
    kaneg
        16
    kaneg  
       2016-11-10 18:49:33 +08:00 via iPhone
    java 本来就不是一切皆对象,原始类型,如 int , long 等
    lightening
        17
    lightening  
       2016-11-10 18:53:07 +08:00
    每个 “一切皆对象” 的语言的 “一切” 的定义都不同……
    102400
        18
    102400  
       2016-11-10 19:22:43 +08:00
    Ruby 应该符合
    otakustay
        19
    otakustay  
       2016-11-10 19:30:50 +08:00
    static 因为没有多态性所以说违背面向对象是可以说的,但确实没有违背一切皆对象,毕竟 class/method/field 都可以是对象

    但我其实不认为 java 里 class 是对象,不然不应该有 this.getClass()这种东西了,你应该可以直接把 MyClass 当作参数传给某方法,或者作为某个类的某个字段
    0915240
        20
    0915240  
       2016-11-10 20:27:37 +08:00
    从大的来说一切都对象。
    细究起来确实是“不常规”。
    georgema1982
        21
    georgema1982  
       2016-11-11 08:14:06 +08:00
    首先 java 并非一切皆对象。所以这个题目本身就是建立在错误前提下的假命题。
    ryanzyy
        22
    ryanzyy  
       2016-11-11 14:13:54 +08:00
    @102400
    lambda {|x| puts x} 是对象
    但是 &(lambda {|x| puts x}) 不是对象
    102400
        23
    102400  
       2016-11-11 15:24:31 +08:00
    @ryanzyy 这是 Python 吧
    ryanzyy
        24
    ryanzyy  
       2016-11-13 17:45:16 +08:00
    @102400 ruby 里的 block 都不是对象
    102400
        25
    102400  
       2016-11-14 18:21:51 +08:00
    @ryanzyy 绝对的纯粹应该没有吧, Ruby 应该可以算比较纯粹的了,至少对 Python 来说
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5323 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:47 · PVG 13:47 · LAX 21:47 · JFK 00:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.