【转自】http://www.rainsts.net/article.asp?id=261
在论坛上经常看到一些莫名其妙的论点,其中有关静态方法的就很多。
1. 静态方法效率比实例方法高……
2. 静态方法比实例方法占内存,只有当类型被释放时才被回收……
3. 多个线程同时调用静态方法时,返回结果可能不准确……
……
说
实话,我很奇怪为什么会有这样的观点。首先,无论是静态方法还是实例方法都是通过类型方法表来查找,然后再去执行的,每次调用都会创建新的临时堆栈,只要
调用代码相同,怎么可能有效率高低之分?如第1种说法,可能是将对象实例化的时间也算进去了。而第2种说法,如果将静态方法换成静态字段就正确了。无论是
静态方法还是实例方法,当调用结束后,其内部临时变量都会失去引用,自然会被GC在合适的时间回收。如果要等类型释放才被回收,那麻烦就大了,因为类型只
有在应用程序域被卸载或者程序关闭时才会被"释放",如此下去,程序还能不出问题?至于第3种说法,我们用一个小例子验证一下。
public class Program
{
static void Test()
{
Console.WriteLine(Thread.CurrentThread.Name + " start...");
Thread.Sleep(10000);
Console.WriteLine(Thread.CurrentThread.Name + " end...");
}
static void Main(string[] args)
{
Thread t1 = new Thread(delegate() { Test(); });
Thread t2 = new Thread(delegate() { Test(); });
t1.Name = "t1";
t2.Name = "t2";
t1.Start();
t2.Start();
}
}
输出:
t1 start...
t2 start...
t1 end...
t2 end...
通过这个例子,我们要明白,每个线程在执行静态方法的时候会创建独立的执行环境,内存中会有多个静态方法"实例"在同时执行。因此只要方法中不涉及共享数据,是不会出现结果出问题这么一说的。
很多初学者,习惯于将所有的方法都写成静态方法,理由是调用简单,想来是对OO思想了解不透的缘故。一般情况下,我们可以遵循以下几个简单的原则。
1. 当方法不需要保存状态,不需要调用外界变量(非方法参数)时,适合用静态方法。
2. 当类型中的方法是一些"互不相干"的帮助型(Helper)方法时,适合使用 static class / static method。
分享到:
相关推荐
C#静态方法与非静态方法的比较
(js)静态与非静态方法,(js)静态与非静态方法
PHP中静态方法(static)与非静态方法的使用及区别.docxPHP中静态方法(static)与非静态方法的使用及区别.docxPHP中静态方法(static)与非静态方法的使用及区别.docxPHP中静态方法(static)与非静态方法的使用及区别.docx
可以用来Mock JAVA代码中的静态方法
20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20....
Java中的静态变量静态方法静态块与静态类.docx
方法名(参数)}”这种格式来调用Java类的静态方法。 开发环境:IntelliJ IDEA 2019.2.2 Spring Boot版本:2.1.8 新建一个名称为demo的Spring Boot项目。 1、pom.xml 加入Thymeleaf依赖 <groupId>org.spring...
Microsoft Visual Studio 2010做的C# winform类的静态成员及静态方法,主要代码: public class Student { private int IDBase = 20080000; private int ID; public static int StudentNumber; public string ...
EXT dojochina Ext类静态方法.rar EXT dojochina Ext类静态方法.rar
本例演示了如何使用反射,调用类的静态方法,封装了工具类ClsTool,统一实现静态方法的调用。使用反射,在特定场景下,能够很好的简化代码。例如mybatis
java初学者在编写类,在调用方法,在静态方法与动态方法使用会出现的一些错误。 学习后 能初步了解自己的错误的原因 以及遇到这种错误的改正方法 避免下次踩坑
用c++的类实现,对于c++初学者帮助较大,主要熟悉静态变量 静态方法的使用 将练习与数据结构相结合
从JVM内存管理的角度谈谈静态方法和静态属性
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) ...
伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪静态伪...
静态(static)方法重写(override)
浅析Java中静态块与静态方法的区别与联系,执行顺序。
本示例程序利用PowerMock演示了如何对静态方法和私有方法进行单元测试(其它模拟单元测试技术无法实现)。
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
在这个文件中,可以像 Java 中的静态方法一样,定义函数或类方法,只需在函数名或方法名前加上 @staticmethod 或者不加,即可定义成静态方法,无需实例化相关对象即可直接调用。 在 Python 中,可以使用模块(Module...