静态成员与实例成员

本文关键字:成员 实例 静态成员 | 更新日期: 2023-09-27 17:54:45

如果我只需要声明一些常量在我的类中使用,并且没有真正需要将它们声明为静态,即不会有几个实例共享该成员,是否有任何意义将它们声明为静态?使用静态成员和实例成员之间是否存在"成本差异"?请给出java和c#的相关信息。

还有,java的静态成员和c#的静态成员有区别吗?

静态成员与实例成员

我需要声明一些常量在我的类

中使用

不知道Java ,但在C#中常量成员本质上是隐式的static

有关更多信息,请参阅MSDN文档:常量(c#编程指南)。引用参考文件:

常量被访问,就好像它们是static字段一样,因为值的值对于该类型的所有实例都是相同的。你不需要使用static关键字来声明它们

我通常将应用程序中的每个常量声明为private static final变量,原因有很多。

  1. 一致性。对于我自己和其他人来说,在我的应用程序中默认的核心常量定义是什么是清楚的。我可以将它们全部分组在一起,如果需要修改它们,很容易导航到它们。因为他们是static,这些变化会影响到每一个电话。这可以防止您意外地对同一个常量进行多个定义。
  2. 性能。如果我有一个永远不会改变的常量,那么在方法调用期间不断为它分配内存是没有意义的。当对类进行引用时,它被分配一次,然后就完成了对它的使用。在所有对类的引用都被用完之前,内存一直保留着引用。
  3. 良好实践。在编程中有一个约定,依赖关系应该尽可能高度解耦。当你将一个函数或变量声明为static时,你强制它必须以静态的方式进行交互,即独立于运行时实例。如果没有在运行时封装成员变量的类的这种依赖,您可以更精确地控制与该类的交互,因为它确保您定义了关于如何与类交互的精确规则。您发现可以声明为static的常量和方法越多,您的软件就越灵活,因为对于应该如何操作某些值和行为几乎没有混淆。
  4. 曝光。您定义的一些函数或常量可能对应用程序的其他部分有用。这意味着您可以在不需要使用运行时实例的情况下利用功能。例如,二次公式在任何地方都是一样的,那么为什么它应该属于一个单独的实例呢?同样的道理也适用于常数,比如光速。

就我个人而言,我总是将应用程序的所有功能声明为private static。如果类使用该功能作为其操作的一部分是有意义的,那么程序员可以将方法调用包装在另一个方法中,并提供适当的成员变量数据。如果应用程序的另一部分需要使用该静态函数,您所需要做的就是增加该函数的可见性。

在Java中,常量是而不是隐含static;常量并不是一个实际的语言规范,所以Java中的常量只是我们称为常量的变量。

在c#中,常量是隐式静态的。常量是语言规范的一部分,并在文档中声明:
访问

常量就像访问静态字段一样,因为对于该类型的所有实例,该常量的值是相同的。不需要使用static关键字来声明它们。

如果你将constant声明为静态,那么你的程序将只使用一个内存位置来存储该常量值,如果你不使用静态,那么每个对象将单独存储该常量。正如你所说的,没有几个实例,在这种情况下,要么指定常量为static,要么简单地声明它,两者的成本相同。