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

时间:2010-10-18 22:37:35

标签: java static

我们应该如何以及在何处使用静态修改器:

1。领域和 2.方法?

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

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

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

更新1:

因此,实用方法应该是静态的,即其工作仅取决于方法参数。那么,例如,方法updateString(String inputQuery, String highlightDoc)是否应该是this question中的静态方法?

7 个答案:

答案 0 :(得分:20)

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

  1. 静态字段/方法只有一个“副本”。
  2. 静态字段/方法无法访问非静态字段/方法。
  3. 有几个例子你想要制作一些静态的东西。

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

    类似地,静态方法可用于执行“实用程序”作业,所有必需的依赖项都作为参数传递给方法 - 您不能在静态方法中引用“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
    }
}