`
jarod2008
  • 浏览: 82409 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

有关静态方法的一些"谬论"

    博客分类:
  • java
阅读更多

【转自】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。

分享到:
评论

相关推荐

    Java中的静态变量静态方法静态块与静态类.docx

    Java 中的静态变量、静态方法、静态块和静态类 Java 中的静态变量、静态方法、静态块和静态类是 Java 编程语言的四个重要概念,它们之间存在着紧密的关系。下面将对这四个概念进行详细的介绍。 一、静态变量...

    静态方法同步 与 非静态方法同步

    本篇文章将深入探讨“静态方法同步”与“非静态方法同步”的差异、应用场景以及它们如何影响程序的并发性能。 首先,我们来了解什么是同步。在Java中,同步是通过`synchronized`关键字实现的,它用于确保同一时间...

    静态(static)方法重写(override)

    ### 静态(static)方法与重写(override) #### 一、概念解析 在面向对象编程语言中,如Java,方法重写(override)是一种重要的特性,它允许子类提供一个与父类相同签名的方法实现。这种方法的实现允许在运行时...

    Java中的Static块与静态方法

    1. **目的不同**:静态方法用于执行与类相关的操作,而静态块用于类的初始化,尤其是在类加载时对静态资源进行初始化。 2. **调用方式不同**:静态方法可以通过类名直接调用,而静态块是由JVM自动执行的,无法直接...

    JMOCKIT mock 静态方法 单元测试

    可以用来Mock JAVA代码中的静态方法

    生成静态的方法

    下面我们将深入探讨静态方法、静态变量以及静态类等相关的知识点。 1. 静态方法 静态方法是与类关联,而不是与类的实例关联的方法。这意味着我们不需要创建类的实例就可以调用静态方法。它们在内存中只有一份,且在...

    静态方法,静态成员变量的调用

    这是因为在静态方法执行时,没有特定的对象实例,所以无法访问与特定对象相关的实例变量。相反,实例方法没有这样的限制,它们既可以访问静态成员,也可以访问实例成员。 以下是一些示例来进一步解释这一点: 1. ...

    从JVM内存管理的角度谈谈静态方法和静态属性

    静态方法内不能直接访问非静态(实例)属性,因为这些属性属于特定对象,而静态方法没有隐含的对象引用。 非静态方法(实例方法)则包含一个隐含的参数,即对象实例的引用,这个引用在栈中存储。当调用非静态方法时...

    EXT dojochina Ext类静态方法.rar

    EXT dojochina Ext类静态方法是一个关于EXT框架在JavaScript中的使用的主题,主要聚焦于Ext类的静态方法。EXT是一个强大的前端开发框架,由Sencha公司开发,它提供了丰富的组件库,用于构建复杂的Web应用程序。在EXT...

    通过反射调用静态方法

    本文将详细讲解如何通过反射调用静态方法,并探讨在特定场景下,如MyBatis中的应用。 首先,理解反射的概念是至关重要的。在Java中,反射API(java.lang.reflect)允许我们获取类的信息,包括类名、构造函数、方法...

    20.静态方法.zip

    20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20....

    【C# winform 代码】类的静态成员及静态方法

    Microsoft Visual Studio 2010做的C# winform类的静态成员及静态方法,主要代码: public class Student { private int IDBase = 20080000; private int ID; public static int StudentNumber; public string ...

    Java中静态方法和非静态方法的区别.docx

    Java 中静态方法和非静态方法的区别 Java 作为一种功能强大、可靠性高、跨平台的编程语言,广泛应用于企业级应用开发、移动应用开发、云计算、大数据处理等领域。了解静态方法和非静态方法的区别是 Java 编程的基础...

    c#面向对象静态类、构造方法、静态方法介绍.zip

    在C#编程中,面向对象是核心特性之一,它提供了静态类、构造方法以及静态方法等概念,这些是创建高效、可维护代码的关键元素。让我们深入探讨这些知识点。 首先,静态类是C#中不能被实例化的类,它们只包含静态成员...

    jni调用java静态方法

    在上面的代码中,`FindClass()`用于获取Java类的`jclass`对象,`GetStaticMethodID()`用于获取静态方法的ID,最后`CallStaticVoidMethod()`执行静态方法。注意检查可能的错误,如找不到类或方法,并处理可能出现的...

    java无法从静态上下文中引用非静态一些错误

    java初学者在编写类,在调用方法,在静态方法与动态方法使用会出现的一些错误。 学习后 能初步了解自己的错误的原因 以及遇到这种错误的改正方法 避免下次踩坑

    易语言源码实现易语言类静态数据成员的方法.7z

    易语言是一种专为中国人设计的编程语言,它以简明直观的中文语法,降低了编程的门槛,...静态数据成员在设计和实现一些需要全局共享状态或计数器等功能时非常有用,但应谨慎使用,避免造成不必要的复杂性和潜在的问题。

    单链表 数据结构 静态变量、静态方法的使用

    用c++的类实现,对于c++初学者帮助较大,主要熟悉静态变量 静态方法的使用 将练习与数据结构相结合

    什么是静态(static)什么是静态方法,静态变量,静态块

    在Java编程语言中,"静态"(static)关键字是一个非常重要的概念,它具有多种用途,包括定义静态变量、静态方法、静态初始化块以及静态类。理解这些概念对于编写高效的Java代码至关重要。 首先,我们来解释静态变量...

    静态方法和非静态方法的调用.pdf

    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) ...

Global site tag (gtag.js) - Google Analytics