在这个简单的例子中,static关键字的目的是什么?

时间:2013-01-23 20:26:26

标签: java static

  

可能重复:
  When should a method be static?

通常在为类编写静态方法时,可以使用ClassName.methodName访问该方法。在这个简单的例子中使用'static'的目的是什么?为什么应该/不应该在这里使用它?私有静态也会破坏使用静态的目的吗?

public class SimpleTest { 

   public static void main(String[] args) {
         System.out.println("Printing...");
         // Invoke the test1 method - no ClassName.methodName needed but works fine?
         test1(5);
   }

   public static void test1(int n1) {
         System.out.println("Number: " + n1.toString());
   }
   //versus
   public void test2(int n1) {
         System.out.println("Number: " + n1.toString());
   }
   //versus
   private static void test3(int n1) {
         System.out.println("Number: " + n1.toString());
   }
}

我看了几个教程。例如。 http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

我对它的理解是,不是创建一个类的实例来使用该方法,你可以只使用类名 - 节省内存,因为在某些情况下,每次使用特定的对象构造对象都没有意义方法

8 个答案:

答案 0 :(得分:4)

static关键字的目的是能够在不创建类实例的情况下使用成员。

这就是这里发生的事情;调用所有方法(包括私有方法)而不创建SimpleTest的实例。

答案 1 :(得分:1)

static表示该函数不需要调用类的实例。而不是:

SimpleTest st = new SimpleTest();
st.test2(5);
你可以致电:

SimpleTest.test1(5);

您可以在this article中阅读有关静态方法的更多信息。

关于private static的问题有already been asked here。要带走的重要部分是:

  

私有静态方法本身并不违反OOP,但是当你在一个不需要(也不能*)访问实例字段的类上有很多这些方法时,你就不会以OO方式编程,因为“对象”意味着状态+操作在一起定义的那个状态。如果他们不需要任何状态,为什么要将这些方法放在该类上? -eljenso

答案 2 :(得分:1)

在本例中,Static用于直接访问方法。私有静态方法违背了“数据隐藏”的目的。

你的main可以直接调用test1方法,因为它也是Static,它不需要任何对象进行通信。Main不能引用non-static成员,或者任何其他非静态成员都不能引用静态构件。

"non-static members cannot be referred from a static context"

有关静态成员的详细信息,请参阅This thread

答案 3 :(得分:0)

static表示该方法与类的实例无关。

它与public / protected / private正交,这决定了该方法的可访问性。

答案 4 :(得分:0)

您将静态方法放在与您的类的特定实例无关的所有计算中。

关于可见性,public static用于导出功能,而private static用于独立但内部使用。

例如,假设您要为类的每个实例分配唯一标识符。为您提供下一个ID的计数器与任何特定实例无关,您也不希望外部代码对其进行修改。所以你可以这样做:

class Foo {
    private static int nextId = 0;

    private static int getNext () {
        return nextId ++;
    }

    public final int id;

    public Foo () {
        id = getNext();    // Equivalent: Foo.getNext()
    }
}

如果在这种情况下您还希望从类外部知道已创建了多少个实例,则可以添加以下方法:

public static int getInstancesCount () {
    return nextId;
}

关于ClassName.methodName语法:它很有用,因为它指定了提供静态方法的类的名称。如果你需要从类中调用方法,你可以忽略第一部分,因为名称methodName在命名空间方面最接近。

答案 5 :(得分:0)

在示例中从test1调用main而不使用类名,因为test1是与main在同一类中的静态方法。如果您想从test2调用main,则需要首先实例化该类的对象,因为它不是静态方法。

答案 6 :(得分:0)

当该方法在同一个类中时,静态方法不需要使用类名限定。 方法是私有的(静态的或非静态的)仅仅意味着它不能从另一个类访问。 实例方法(在您的示例中为test2)只能在类的实例上调用,即:

new SimpleTest().test2(5);

答案 7 :(得分:0)

由于main是一个静态方法,如果你想调用类的方法而不必实例化它,你需要使这些方法也是静态的。

关于使私有方法静态,它具有比其他方法更多的可读性。引擎盖背后并没有那么大的差异。