Java中关于静态方法的疑问

sd4324530 2012-06-02 04:04:27
Java语法中规定,静态方法的访问方式为类名.方法名。
相对于普通方法而言,调用起来更加的方便,那么,我有这样的想法,把所有的方法都改写成静态的,那使用起来不就很方便了嘛,干嘛还要写成普通方法,每次必须new对象才能使用。

我这里指的所有方法,主要可以针对于系统里的dao层,即所有的业务逻辑处理的方法,比如各种数据的查询,把所有的这些业务逻辑处理的方法都改成静态的。

我觉得这样做应该是不好的,要不然早就这么做了,那么,静态方法是有什么缺陷吗?所以才不能这样做。

系统里很多的工具类的方法,一般都写成静态的,不也是为了使用方便吗?
为什么不能把逻辑处理的方法都改成静态的呢?

新手求解惑
...全文
2355 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
so_fast 2013-08-08
  • 打赏
  • 举报
回复
讨论的很激烈吗,呵呵。 我想问个问题, 就是代码中使用静态方法 对并发的效率是否有影响呢、 例如:我的一个静态方法是公用 的,为所有的类提供查询数据库的操作。
wankaiming 2012-06-09
  • 打赏
  • 举报
回复
3楼说的挺精炼的

静态的问题是大家都可以用 如果你有个学生类Student然后new了两个实例s1,s2如果是静态的 那么他们岂不是会共用属性了 会出问题
zqfddqr 2012-06-09
  • 打赏
  • 举报
回复
楼主这么喜欢静态方法.可能是你的编程思维还没有转到面向对象上来
BlueTee 2012-06-09
  • 打赏
  • 举报
回复
静态方法的优缺点楼上都说了,我就没必要纠结了,你是定义没搞清楚,JDK中确实有很多静态的那是因为他们不需要调用一些特殊属性,自己直接赋值进去而不需要用到方法所在类中的特有数据,所以用静态修饰,static修饰的都是共享成员,这些成员跟对象没有关系,优先于对象存在,变量可以说创建类的时候这些静态成员就已经在内存开辟空间,不需要通过创建对象再在堆里面开辟空间,静态方法只能调用静态(对象共享的数据),一句话:静态修饰的能够独立存在不依赖对象
BlueTee 2012-06-09
  • 打赏
  • 举报
回复
你好像没了解静态方法的含义,静态方法的含义是:方法中不调用对象的特殊属性,如果调用了特殊的属性,那这个方法就不能用Static修饰,特殊属性比如说人的名字,这个每个人都不同,需要构造函数进行初始化,如果类中的某个方法要用的名字name那么这个方法修饰符就不能加Static
CST08055 2012-06-09
  • 打赏
  • 举报
回复
静态方法在使用时就已经编译好了,也就是静态方法一直在内存中,如果所有的方法都弄成静态方法那么非常消耗内存资源
xlhb 2012-06-09
  • 打赏
  • 举报
回复
从你的回复来看,你可能不太理解NIO机制,NIO是支持长连接的;主要原理是基于事件机制,采用非阻塞技术;所以不会因为read或write导致线程因为需要等待数据而阻塞。

你可以用一个线程负责10个用户的数据接收,负责另外10个用户的数据发送。

当然也可以用一个线程同时负责5个用户的数据接收和发送。


另外也请你放心的是,NIO并非Java原创,它早就广泛应用于各种操作系统。
大并发系统基本上没有不采用非阻塞IO机制的。
xlhb 2012-06-09
  • 打赏
  • 举报
回复
静态方法是属于类的,内存必须为它分配内存空间,这个空间一直由静态方法占用,内存管理器不会由于静态方法没有被调用而将静态方法的存储空间收回,这样如果将所有的方法都声明为静态方法,就会占用大量的内存空间,最后是系统变慢。而普通的成员方法是由对象调用的,内存并不会一直为起分配内存,只有调用的时候才为其分配存储空间,而当其没有被调用时,存储空间就会被内存管理其收回,释放没有用的空间,提高的系统的运行速率!希望对楼主有帮助!
sd4324530 2012-06-09
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 的回复:]

静态不静态,和多线程没有一毛钱关系吧

涉及到多线程的话,非静态也要考虑同步
[/Quote]

是啊,如果静态就会影响同步的话,那么难道非静态方法就一定多线程安全吗。。。
那么,为什么静态方法不能大量的使用呢?
碍于面向对象原则还有设计模式的原则?
代码扩展性不好?
还是神马?
RDroid 2012-06-09
  • 打赏
  • 举报
回复
静态不静态,和多线程没有一毛钱关系吧

涉及到多线程的话,非静态也要考虑同步
纵一苇就是我 2012-06-08
  • 打赏
  • 举报
回复
我感觉静态方法像C、C++中的全局方法
sffx123 2012-06-08
  • 打赏
  • 举报
回复
不说什么设计模式动态加载什么的,从最实际的角度来看问题:
1.static方法在多线程的时候,需要考虑同步问题。增加代码复杂度
2.“我这里指的所有方法,主要可以针对于系统里的dao层”,dao层都是数据库相关的,对效率跟准确性要求很高,你写成静态的多线程的时候就要考虑是否加锁才能保证数据安全跟正确,这样效率就会很差。
一般除非有必要,不要声明静态的方法跟变量。
suen.sun 2012-06-08
  • 打赏
  • 举报
回复
楼主的恩师是乎没有给你讲得很深入呀!
sd4324530 2012-06-08
  • 打赏
  • 举报
回复
看来主要的原因都是为了设计模式和面向对象思想的原因才不能都写成静态的

如果非要那么写,就是违反了这些规则,同时比较吃内存,但是系统依然可以安全的继续跑
wushiandy 2012-06-07
  • 打赏
  • 举报
回复
静态方法不允许重写了。
sd4324530 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

全静态,面向对象的精髓 多态就没用了
[/Quote]

嗯,这样违反了面向对象的原则,使得系统的可扩展性降低。
但是如果不考虑这些,这样的设计方式,会影响系统的正常使用吗?
比如多线程并发导致系统出现混乱之类的
sd4324530 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

静态方法只能访问静态变量,你是想把你所有的变量都写成静态的吗?那这个类的对象都共用同一个变量?
[/Quote]

我没有说把所有的方法都改写,主要是逻辑处理层的方法改写,比如传入一个对象,将其插入数据库等等之类的,不需要用到类本身定义的变量。
sainer 2012-06-05
  • 打赏
  • 举报
回复
全静态,面向对象的精髓 多态就没用了
ceclinux 2012-06-05
  • 打赏
  • 举报
回复
实例变量和实例方法只能在实例方法中使用,不能再静态方法中使用。
也就是是说,我一直使用静态方法,几乎整个程序都是静态变量了。
所以很占内存空间,我是这样认为的
sd4324530 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

主要是没有多态,多态众多设计模式必备的东西
[/Quote]

就是说,我说的这种想法本身没有什么不妥,只是不利于扩展?
加载更多回复(18)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧