如何以及在何处使用Java中的Static修饰符?

我们应该如何以及在何处使用Static修饰符:

场和
2.方法?

例如,在java.lang.Math类中,字段方法如abs(),atan(),cos()等是静态的,即它们可以被访问为: Math.abs()

但为什么这是一个好习惯呢?

说,我不保持静态并创建类的对象并访问它,无论如何我都可以,我会得到一个警告,你试图以非静态方式访问静态方法(如指出通过@duffymo,而不是Math类)。

更新1:

因此,效用方法应该是静态的,即其工作仅取决于方法参数。 那么,例如,方法updateString(String inputQuery, String highlightDoc)应该是这个问题中的静态方法吗?

您可以将“静态”方法或字段视为在类定义之外声明它。 换一种说法

  1. 静态字段/方法只有一个“副本”。
  2. 静态字段/方法无法访问非静态字段/方法。

有几个例子你想要做一些静态的东西。

字段的规范示例是创建一个静态整数字段,该字段在类的所有实例(对象)中保持计数。 另外,单例对象例如通常也使用静态修改器。

类似地,静态方法可用于执行“实用程序”作业,其中所有必需的依赖项作为参数传递给方法 – 您不能在静态方法中引用“this”关键字。

在C#中,您还可以拥有静态类,正如您可能猜到的那样,它们只包含静态成员:

 public static class MyContainer { private static int _myStatic; public static void PrintMe(string someString) { Console.Out.WriteLine(someString); _myStatic++; } public static int PrintedInstances() { return _myStatic; } } 

Static使用较少的内存,因为每个Classloader只存在一次。

要使方法静态可以节省一些时间,因为您不必先创建一个对象,这样就可以调用一个函数。 你可以/应该使用静态方法,因为它们几乎独立(即Math.abs(X) – 函数确实没有对象。)基本上它是一个方便的东西(至少就我看来 – 其他人可能会也会不同意:P)

静态字段应该谨慎使用。 有很多模式需要静态字段……但首先是基础知识:

静态字段只存在一次。 所以如果你有一个简单的类(有点伪代码):

 class Simple { static int a; int b; } 

现在你用以下物体制作物品:

 Simple myA = new Simple(); Simple myB = new Simple(); myA.a = 1; myA.b = 2; myB.a = 3; myB.b = 4; System.out.println(myA.a + myA.b + myB.a + myB.b); 

你会得到3234 – 因为通过设置myB.a你实际上也会覆盖myA.a因为a是静态的。 它存在于记忆中的一个地方。

你通常想避免这种情况,因为可能会发生奇怪的事情。 但是,如果您以工厂模式为例进行谷歌搜索,您会发现这种行为实际上非常有用。

希望能把它搞清楚一点。

试着看一下这篇文章,它还给出了一些关于何时何时不使用静态和最终修饰符的例子。

上面的大多数post都很相似,但这篇文章可能会提供其他一些见解。
何时使用静态修改器

通常当方法仅依赖于函数参数而不依赖于对象的内部状态时,它是一个静态方法(单线程是唯一的例外)。 我无法想象真正使用静态字段的位置(它们与应该避免的全局变量相同)。
与您的示例中一样,数学函数仅取决于参数。

对于字段,如果希望给定类的所有实例都可以访问其值,则应将其保持为静态。 例如,如果我有

 public static int age = 25; 

然后,类的任何实例都可以获取或设置age的值,并且所有实例都指向相同的值。 如果你确实做了一些静态的事情,你就冒着让两个实例覆盖其他值并可能导致问题的风险。

创建静态方法的原因主要是实用函数,其中传递了方法的所有必需数据,并且您不希望每次要调用方法时都要创建类的实例。

您无法实例化java.lang.Math的实例; 没有公共构造函数。

尝试一下:

 public class MathTest { public static void main(String [] args) { Math math = new Math(); System.out.println("math.sqrt(2) = " + math.sqrt(2)); } } 

这是你会得到的:

 C:\Documents and Settings\Michael\My Documents\MathTest.java:5: Math() has private access in java.lang.Math Math math = new Math(); ^ 1 error Tool completed with exit code 1 
 class StaticModifier { { System.out.println("Within init block");//third } public StaticModifier() { System.out.println("Within Constructor");//fourth } public static void main(String arr[]) { System.out.println("Within Main:");//second //StaticModifier obj=new StaticModifier(); } static { System.out.print("Within static block");//first } }