在 Java 中为什么不全部使用 static 方法?

2022-07-21 10:55:45 +08:00
 qiqiqi7001

为什么不能全部用 static

10366 次点击
所在节点    Java
103 条回复
chengyiqun
2022-07-21 11:03:49 +08:00
快进到全民面向过程编程(误
因为 java 是面向对象的, 比如我有个猫类, 里面有个喵喵叫方法.
你要写成全局静态的, 然后给狗狗调用嘛?
paradoxs
2022-07-21 11:05:34 +08:00
内存
xhldtc
2022-07-21 11:05:35 +08:00
因为如果每个方法都是静态的,java 就不会是面向对象的。

您需要在不同的对象上调用方法,因为它们具有不同的状态。

PS:这个问题太基础了,多写点代码就会发现 static 和非 static 方法的区别了
pannanxu
2022-07-21 11:06:17 +08:00
jvm:听我说谢谢你,感谢有你,温暖了四季
Kimen
2022-07-21 11:09:22 +08:00
jvm:听我说谢谢你,感谢有你,温暖了四季
xiaofan305
2022-07-21 11:12:11 +08:00
个人认为,对于单例对象,是可以全部 static 的。但是 java 的程序多数都需要搞什么依赖注入,方便解耦,统一生命周期管理和一些事件的处理,这时候就不能全部 static 了。如果是自己写的一些小东西,想怎么写都行,不纠结
lmshl
2022-07-21 11:12:55 +08:00
这不就是 Rust/Haskell 嘛
当然 Scala 里也可以很轻松实现仅用 static (object method) ,typeclass 风格
理论上在 Java 中只用 static 方法也是可行的,相当于你手动展开 typeclass 调用而已,自己一个人的项目随便怎么玩都行
murmur
2022-07-21 11:13:19 +08:00
这个东西其实就是个编程习惯的问题

比如
Person p1 = new Person(xxx);
Person p2 = new Person(xxxx)
p1.fuck(Person2) //类方法

和 PersonUtil.fuck(p1, p2) //静态方法

用好了其实没什么高下之分
quicksand
2022-07-21 11:15:12 +08:00
@murmur 你这个例子怎么带颜色的
kop1989smurf
2022-07-21 11:16:27 +08:00
可不可以全部用静态修饰词?当然可以。
好不好?在 java 中这么用不好。

类与对象( class/object ),公共与私有(public/private),静态(static),继承(extends),接口(interface),实现(implements),这是面向对象的核心理念。
这也是你使用 java 这个“面向对象原教旨主义”语言的最大理由之一。
kop1989smurf
2022-07-21 11:17:54 +08:00
这就像是,你手里又把突击步枪,你说这枪托很硬,我们为什么还要浪费子弹射击呢?用枪托砸人不行么?
当然行,但砸人你为何不用甩棍?
seth19960929
2022-07-21 11:20:28 +08:00
感觉楼上都没说到带你, 我给你说一个实际的.
每个一个对象都有自己的内存地址, 静态的共享内存. 所以本质就是这样.
比如一个 Person 对象要说出自己的名字, 我只用实例化的时候传入名字, say 方法不用管这么多. 直接输出 this.name, 但是静态的话, 你就得考虑怎么实现了.
seth19960929
2022-07-21 11:20:51 +08:00
没说到带你 -> 没说到点
qiqiqi7001
2022-07-21 11:21:23 +08:00
@paradoxs 内存这个问题我知道
1.静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,
所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,
而且静态内存是有限制的,太多了程序会启动不了。
但是我还看到另一个结论
2.静态方法和实例方法其实在性能上没有区别,加载时机,和内存占用都一样,调用速度也没有区别。
我想问这两个那个是正确的
murmur
2022-07-21 11:22:37 +08:00
@seth19960929

Person 只要有 getName 就可以让别人帮你 say 了,这对于 bean 来说几乎是都有的 get 方法
murmur
2022-07-21 11:23:51 +08:00
我大概明白什么意思了,getName 也不是 static
那 Person 全 static ,数据就得用 Map<String, Object>了
wolfie
2022-07-21 11:24:13 +08:00
了解什么是面向对象吗。
Leviathann
2022-07-21 11:28:33 +08:00
听说是因为早期不让 import static
thinkershare
2022-07-21 11:29:40 +08:00
人力是有限的, 状态管理是困难的, 所以我们有了方法执行的上下文, 并限制了在上下文上可执行的操作, 因此有了对象. 你当然可以彻底抛弃对象, 然后将 class 作为 namespace. 那我什么不选择 C 语言呢?
retrocode
2022-07-21 11:30:28 +08:00
@murmur #8 其实还是有区别的, 假设 fuck 方法内部有一个 doll 参数, 那 p1/p2.fuck 的 doll, 大概率只是同一厂家不同批次生产的同一型号, 而 PersonUtil.fuck 里的 doll 则从头到尾就是同一个(战术后仰)!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/867705

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX