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

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

为什么不能全部用 static

10411 次点击
所在节点    Java
103 条回复
caroline1022
2022-07-21 11:31:31 +08:00
我能想到的一个点是,面向对象的使用方式抽象度更高

比如同样一个让动物叫的功能,你在具体编码的时候无需知道具体场景下过来的是个什么动物,你只需要调用动物.叫()这个方法就行了。每一个不同的动物类别自己去实现叫()这个方法就可以

但如果是静态方法的话,你需要在具体场景中判断如果是个猫得调用 猫.叫(),如果是个狗得调用 狗.叫(),这个耦合度会高得多,更难维护也更容易出问题

比如以后如果来个新的动物,面向对象的话只需要让这个新动物实现叫这个方法就可以,不需要修改业务代码;但如果是静态方法则需要在所有调用叫方法的地方里增加新的判断。
Achieve7
2022-07-21 11:32:55 +08:00
所有的静态方法共享一个内存块儿, 全静态了内存没法管理, 线程一开直接 GG
dqzcwxb
2022-07-21 11:34:28 +08:00
对对对,就是要把 jvm 这个小娘们直接塞满
ScepterZ
2022-07-21 11:45:47 +08:00
如果你是单例的场景,全 static 也不是不行。否则我是真不知道你要咋写代码……
Chinsung
2022-07-21 11:45:53 +08:00
面向对象本身就是为了这个目的去设计的
一个接口,有一个方法是发出叫声
猫实现了这个接口,是喵
狗实现了这个接口,是汪
如果用静态类,那只能
Util.dog 叫(狗)
Util.cat 叫(猫)
这样既要类型检查,能有多少种动物叫就得有多少个方法从名字上区分。
更别说,你如果想要知道这个猫到底能做哪些事,你得找一遍所有静态类,才能知道这个猫被哪些类支持
icyalala
2022-07-21 11:46:08 +08:00
static 变量才会在 load class 时分配内存,static 方法在这方面和一般方法可以认为没什么区别。
你大可以全用 static 方法 + 实例变量,把 Java 变成 C 函数 + struct 。
newmlp
2022-07-21 11:48:06 +08:00
@qiqiqi7001 所有方法肯定是程序加载的时候就都分配好空间了啊,怎么会有动态生成方法的做法,不管是不是静态方法,方法都是所有实例共享的,但是调用时传的 this 不一样而已
unco020511
2022-07-21 11:48:07 +08:00
那你咋面向对象,你都没对象了,咋管理数据和状态?
0x2CA
2022-07-21 11:52:23 +08:00
其实也可以的,你可以使用 ecs 编程方式,实体-组件-系统的方式,这样你方法都是依赖组件的,不关乎什么对象,只要有这个组件的对象都有这个行为,面向数据编程
qiqiqi7001
2022-07-21 11:53:10 +08:00
@newmlp 我啥时候说动态生成方法的做法了,,,,
cpstar
2022-07-21 11:57:09 +08:00
有啥不能的,能编译过去,能运行那就是能。
为啥不能的,因为人为设置了条条框框,比如告诉你这个是 OO ,full static method 不叫 OO ,那甭管是 singleton 还是 Util 方式的,叫不叫 OO ?
不要在意这些细节,怎么用的爽怎么来,哪来那么多优雅。
seth19960929
2022-07-21 11:59:53 +08:00
@murmur 是, 设计问题. 你用 map 还得多考虑一次并发问题
xfriday
2022-07-21 12:02:11 +08:00
非 static 方法只是把 this 作为隐式参数传递进函数而已
xuboying
2022-07-21 12:02:19 +08:00
不懂 Java ,从语言的角度应该没有什么限制吧。
感觉更多的是一个设计模式的问题。(如果是 solo ,那么设计模式其实也没什么纠结的必要了)

举一个 C++新版本里有一个 adhoc 的多态的例子。你说到的问题有一点点相似。有人做了 subtype 多态和 adhoc 的多态的区别比较。认为 subtype 的多态对新派生类更友好,adhoc 的多态对新 method 更友好。所以如果你的使用场景符合维护时会添加更多的 method ,可能写 static 方法会更适合。
qiqiqi7001
2022-07-21 12:05:35 +08:00
@xhldtc 对象不是静态,调用之间都是掉静态方法
oneisall8955
2022-07-21 12:16:06 +08:00
多态,接口问题,思考下
siweipancc
2022-07-21 12:19:53 +08:00
啊这……
gouflv
2022-07-21 12:25:16 +08:00
OOP 说了:我要抽象一切

ps:多少静态方法能把 jvm 塞满?
cedoo22
2022-07-21 12:36:29 +08:00
jvm:听我说谢谢你,感谢有你,温暖了四季

全静态,直接变面向过程 /函数编程。
DamonLin
2022-07-21 12:37:48 +08:00
我和你有过这样的疑问哈哈

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

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

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

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

© 2021 V2EX