我们应该如何以及在何处使用静态修改器:
1。领域和 2.方法?
对于java.lang.Math
类中的example,诸如abs(),atan(),cos()等字段方法是静态的,即它们可以被访问为:Math.abs()
但为什么这是一个好习惯?
说,我不保持静态并创建类的对象并访问它,无论如何我都可以,我会得到一个警告,你试图以非静态方式访问静态方法(正如@duffymo所指出的,不是在Math类的情况下。)
更新1:
因此,实用方法应该是静态的,即其工作仅取决于方法参数。那么,例如,方法updateString(String inputQuery, String highlightDoc)
是否应该是this question中的静态方法?
答案 0 :(得分:20)
您可以将“静态”方法或字段视为在类定义之外声明。换句话说
有几个例子你想要制作一些静态的东西。
字段的规范示例是创建一个静态整数字段,该字段在类的所有实例(对象)中保持计数。另外,例如,单例对象通常也使用静态修饰符。
类似地,静态方法可用于执行“实用程序”作业,所有必需的依赖项都作为参数传递给方法 - 您不能在静态方法中引用“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;
}
}
答案 1 :(得分:8)
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是静态的。它存在于记忆中的一个地方。
您通常希望避免这种情况,因为可能会发生奇怪的事情。但是,如果您以工厂模式为例进行谷歌搜索,您会发现这种行为实际上非常有用。
希望能稍微清理一下。
答案 2 :(得分:2)
试着看一下这篇文章,它还给出了一些关于何时何时不使用静态和最终修饰符的例子。
上面的大多数帖子都很相似,但这篇文章可能会提供其他一些见解。
When to use Static Modifiers
答案 3 :(得分:1)
通常当方法仅依赖于函数参数而不依赖于对象的内部状态时,它是一个静态方法(单线程是唯一的例外)。我无法想象真正使用静态字段的位置(它们与应该避免的全局变量相同) 与您的示例中一样,数学函数仅取决于参数。
答案 4 :(得分:1)
对于字段,如果希望给定类的所有实例都可以访问其值,则应将其保持为静态。例如,如果我有
public static int age = 25;
然后,该类的任何实例都可以获取或设置age的值,并且所有实例都指向相同的值。如果你确实做了一些静态的事情,你就冒着让两个实例覆盖彼此的值并可能导致问题的风险。
创建静态方法的原因主要是实用函数,其中传递了方法的所有必需数据,并且您不希望每次要调用方法时都要创建类的实例。
答案 5 :(得分:0)
您无法实例化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
答案 6 :(得分:0)
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
}
}