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

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

为什么不能全部用 static

10500 次点击
所在节点    Java
103 条回复
iold
2022-07-21 22:01:29 +08:00
你这个问题,让我想起来,毕业的第一份工作,接手别人的项目,状态就是一个静态类,里面八百多个静态变量。当时看的我就不会了,一个注释没有。需求是,国际象棋加个简单的机器人,可以人机对战。改的自己怀疑人生,从那以后我的命就不好,老接手插屁股的活儿...
aristotll
2022-07-21 23:19:07 +08:00
当成 c 写 就可以全是静态方法
tenstone
2022-07-21 23:28:58 +08:00
那样就失去了面向对象的意义
qua
2022-07-21 23:42:08 +08:00
因为 Spring 没法动态代理
Kaiv2
2022-07-21 23:48:01 +08:00
static 方法 非 static 方法 JVM 内存占用大小没啥区别,都是存放的字节码。
主要是面向对象,方便扩展。
zrc
2022-07-22 00:16:28 +08:00
static 的方法好做单元测试不?
多线程环境下 static 持有的数据要考虑并发问题吧
kaneg
2022-07-22 00:17:21 +08:00
那就退化到 c 语言了
realpg
2022-07-22 04:11:32 +08:00
@janus77 #77
世界上总有很多人非得把一个东西改造成另一个的样子,并以此为乐

比如 php 的消亡, 跟两个好东西,laravel 和 swoole 有直接关系.一个想把 php 改成 java 那样,一个想把 php 改造成 golang 那样.

这两个是不是好东西?是. 但是直接导致了 php 没落的超级加速
Aloento
2022-07-22 05:45:14 +08:00
面向对象跟面向过程的区别

php 已经不行了
realpg
2022-07-22 05:53:25 +08:00
@chengyiqun #1
类比不恰当
有个 Dog 类, 有个吃屎方法

万一没写明白,给某人调用就好晚了
realpg
2022-07-22 05:54:58 +08:00
@Aloento #89
我 2006 年开始用 PHP, 基本全面向对象, 即使 php4 的后期版本也各种对象用法
当然,除了写个简单的单页调试啥的可能直接过程了
makelove
2022-07-22 08:34:42 +08:00
Java 出生那年代是面向对象火热的年代,所以就搞成了函数不是一等公民的硬伤,现在的语言就不会干函数必需要从属于一个类这种傻事,毕竟不是只有面向对象一种编程模式,甚至是罕见的
xuyang2
2022-07-22 09:10:09 +08:00
因为 static 让代码本身(而不是实例)变成有状态的了
summerLast
2022-07-22 09:22:03 +08:00
这个问题需要从两方面看,
首先 能不能全部用 static 方法? 答:能,
与实例方法区别是什么?答:1.有无 this 或 self 的语法糖,2.内聚性的强弱,3idea 等工具的友好型,等等
然后 好处和坏处是什么? 答:参考区别
最后就是有无必要全部用 static 方法 ?答:无必要
summerLast
2022-07-22 09:25:59 +08:00
@summerLast
这个问题需要从两方面看,
首先 能不能全部用 static 方法? 答:能,
那为什么不全部用 static 方法 ,换种问法 与实例方法区别是什么?答:1.有无 this 或 self 的语法糖,2.内聚性的强弱,3.idea 等工具的友好性,等等
然后 好处和坏处是什么? 答:参考区别
最后就是有无必要全部用 static 方法 ?答:无必要
xiqishow
2022-07-22 09:33:21 +08:00
因为这个世界就是这样的[doge]
static 表示了可共享,弱隔离,可是现实世界就是部分共享,绝对隔离,人和人之间如此,物和物也是如此,static 表示弱化了隔离行,能访问便能操作,改变状态。其实和是否面向对象没绝对的关系,因为 static 本身也是可以是一个对象变量。但如果赋予了 static 表示了其状态随着世界生命周期的持续,和访问的不可控制。当然可以说用 protect private 来修饰,但只要是能访问的便可使用,便可操控。所以大家的实现都是可分享的就 static ,需要隔离的就实例化,和现实一样。
私下认为,计算机语言也是对现实生活的抽象和建模,所以其实现思想也是受制于现实世界。
ming159
2022-07-22 10:27:57 +08:00
首先,你可以这么写程序,java 并没有限制你不能这么干.
不过,你要明白 new Object() 等于开辟了一块内存区域,而方法调用的时候,方法中的上下文(this) 可以等同于 这块内存(不严谨). 举例:
``
public class MyObject{

private String name ;

public MyObject(String n){
this.name=n;
}

public void getName(){
return this.name;
}
}
MyObject obj_1 = new MyObject("张三"); // 开辟了 内存 A
MyObject obj_2 = new MyObject("李四"); // 开辟了 内存 B

obj_1.getName(); // 张三
obj_2.getName(); // 李四
``
那么,如果全部是 static 方法,可以自行查阅一下 static 方法内存怎么管理的. 然后上述功能如何体现.自己写一下可能就能理解这么干的优点了.
shijingshijing
2022-07-22 10:32:03 +08:00
@murmur 8# 你这个抽象明显有问题,且不说人寿,连塑料娃娃都没办法处理,而且即使是 Person ,同性异性也不一样。应该抽象成接口,然后各自实现。这样基本上都能包住。
mosliu
2022-07-22 10:43:45 +08:00
@murmur 这个 p1.fuck 是 p1 的自主行为,
PersonUtil.fuck 是一个人来管理员在做物种繁殖行为。

语义上看是不一样的。。
THESDZ
2022-07-22 10:44:55 +08:00
大型工程中降低心智成本

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

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

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

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

© 2021 V2EX