什么时候用静态方法?什么时候实例化?

xingshungames 2010-04-01 02:30:43
如题,在网上搜了一些有关的文章,看了之后还不是很明白。

在存在并发的时候,使用实例化,这个我大概理解。。

不存在并发问题的时候,又在什么情况下用静态,什么时候用实例化呢?

比如说分页方法,邮件发送方法,这些是不是都应该用实例化的方式。

3层中的业务逻辑层,很多都是调用数据访问层的方法。都应该用什么方式?
...全文
1065 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
Q1194189534 2010-12-23
  • 打赏
  • 举报
回复
很精辟!
xingshungames 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 jxyxhz 的回复:]
引用 23 楼 sp1234 的回复:
如果你的对象就是string、int之类的最简单的东西,而不是class、interface那类需要自定义封装和相互继承以及多态的东西,那么你使用static方法就足够了。


呵呵,我觉得我慢慢能跟上sp1234大哥的思路了。。。

每次看到,如饮甘醇。
[/Quote]

……呵呵,我还带多努力努力了……
大腹 2010-04-02
  • 打赏
  • 举报
回复
学习学习学习
xingshungames 2010-04-02
  • 打赏
  • 举报
回复
如果我数据操作类用的静态方法,数据访问层用的是实例方法,然后业务逻辑层,是先声明一个静态的数据访问层的实例,然后调用该静态实例的方法。

请问我这样设计没什么问题吧?

一般情况下都是怎么设计的呢?原因是什么?
freeflying1222 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 xingshungames 的回复:]

大概理解一些了。。。。今天因为这个问题,坐车都一直在考虑,差点多做了一站车……
我目前的理解:
在一个类中,各个方法没有联系,也没有其他的成员,只是单纯的提供一个存放常用方法的仓库作用,这些方法就应该是静态方法。

在一个类中,各个方法和成员有很强的联系性,都是一种对象的方法,应该是实例方法。

这里理解的话,常用的3层中,DAL层和BLL层里一般都是实例方法。而common层里一般……
[/Quote]

部分同意。

这是一个可以从不同的视角来看待的问题。我提供另外一个思路吧!

static方法意味着属于“类”的方法;
实例方法意味着属于某一个“实例”的方法。

以person类为例,person类表示“人”这一种群,而一个 Person zhangsan = new person("张三")表示“张三”这个人。

属于person这个类的方法可以是Person.find("张三"),即从人群中找到张三;
而属于张三的方法可以是zhangsan.Run(),表示张三跑起来了;

一般来说,属于类的方法(static)很难转换成实例方法;但实例方法可以转换成属于类的方法,如Person.Run("张三"),不过这种转换并不是很自然,感觉上象是“让张三跑起来”……
小_虎 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 sp1234 的回复:]
如果你的对象就是string、int之类的最简单的东西,而不是class、interface那类需要自定义封装和相互继承以及多态的东西,那么你使用static方法就足够了。
[/Quote]

呵呵,我觉得我慢慢能跟上sp1234大哥的思路了。。。

每次看到,如饮甘醇。
xingshungames 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 microtry 的回复:]
2楼明显是错的,
还有那么多人支持,晕死了
[/Quote]

指导下,谢谢
xingshungames 2010-04-01
  • 打赏
  • 举报
回复
大概理解一些了。。。。今天因为这个问题,坐车都一直在考虑,差点多做了一站车……
我目前的理解:
在一个类中,各个方法没有联系,也没有其他的成员,只是单纯的提供一个存放常用方法的仓库作用,这些方法就应该是静态方法。

在一个类中,各个方法和成员有很强的联系性,都是一种对象的方法,应该是实例方法。

这里理解的话,常用的3层中,DAL层和BLL层里一般都是实例方法。而common层里一般都是静态方法。

不知道理解的对不对,还要慢慢去消化啊……
缪军 2010-04-01
  • 打赏
  • 举报
回复
2楼明显是错的,
还有那么多人支持,晕死了
wangqianjiao 2010-04-01
  • 打赏
  • 举报
回复

此两点足已
wangqianjiao 2010-04-01
  • 打赏
  • 举报
回复

如果这个方法的参数已经能决定方法的结果了(即与对象没有关系),那么定义为静态的。

如果这个方法只与静态属性有关,那么也定义为静态的。这样说楼主明白吗
  • 打赏
  • 举报
回复
什么数据分配在内存哪里、需不需要额外地写三个字母“new”、速度快还是慢,等等,我觉得没有意义。有意义地是我们如何来简洁地用代码就能来描述生活中的自然而然的概念。面向对象技术是语用学上有意义,而不是死抠它编程时的字典定义(现在世界上至少有几十种面向对象语言,语法各不相同)。你是先明白了要什么,然后才学编程。如果想不到自己有需求要实例化,就不必去考虑什么实例化。而一旦理解为什么要实例化,就要脱离开编程,想想对象的继承和多态在生活中、语言中的原型是什么。
baoluoaoxiang 2010-04-01
  • 打赏
  • 举报
回复
二楼的简单易懂!
  • 打赏
  • 举报
回复
如果你的对象就是string、int之类的最简单的东西,而不是class、interface那类需要自定义封装和相互继承以及多态的东西,那么你使用static方法就足够了。
  • 打赏
  • 举报
回复
其实这没有什么好费神的。如果你从来不进行面向对象设计,而仅仅基于对象(因为你也是使用者OOPL来进行根本不OO的开发),那么肯定就用static方法就够了,那么所有方法都可以是static的!实际上,非常早期的类库就都是这样的。

什么是面向对象呢?假设还是考虑你的static方法,例如:
static void 喂食(动物 x){
....
}

这是够static的方法了吧?可是不同的动物有不同的喂食方法,我敢说你写那个static方法的时候根本不懂这么抽象的喂食方法,我也不懂!所以这个看似很懂的喂食方法其实是空洞的,是我们拿来瞎说的。真正我们唯一可以做到的就是这样:
static void 喂食(I可喂食动物 x)
{
x.喂食();
}
这才是面向对象设计,这才能把喂食这个东西弄得具体一点,我们知道x这个变量所代表的对象一定知道喂食这个方法,因为它实现了那个接口。虽然我们还是空洞地说什么static方法,但是我们知道对象实例自己负责实现喂食方法了,所以我们空洞的静态方法终于不是空洞地说,而是可以执行的了。

这就是一个项目真正在越来越面向需求变动的实际时,方法的多样性。
duxj007 2010-04-01
  • 打赏
  • 举报
回复
学习中 路过
wuyq11 2010-04-01
  • 打赏
  • 举报
回复
静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
静态方法不用创建实例就可调用,比较简单从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来说的。
如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。

http://topic.csdn.net/u/20081216/16/21283fe1-4ffc-4562-9d03-dbbff85603d3.html
flyerwing 2010-04-01
  • 打赏
  • 举报
回复
比如说:
是人都有生命这个方法是不是,这就是静态方法!!!
如果说:
某个人的长相,不如说脸上张了个碗大的黑制,这可不是每个人有的,如果你要调用黑志方法,必须具体到那个人,是不是,要不 有可能没那个方法。

不知道明白了没?
wosizy 2010-04-01
  • 打赏
  • 举报
回复
如果某个方法是用频率较高,或者方法本身通用性较强,无需初始化类成员变量,则可以使用静态方法,那样方便,速度也快.


静态类,不需要实例化就可以直接使用,非静态需要实例化才可以使用
Alden 2010-04-01
  • 打赏
  • 举报
回复
一个是人的方法,一个是作为一个特定的人的你的一个方法。
加载更多回复(16)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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