5

可能的重复:
方法什么时候应该是静态的?

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

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

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

4

8 回答 8

4

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

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

于 2013-01-23T20:28:18.543 回答
1

在此示例中,静态用于直接访问方法。私有静态方法破坏了“数据隐藏”的目的。

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

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

您可以参考此线程以获取有关静态成员的更多信息。

于 2013-01-23T20:30:20.180 回答
1

static意味着该函数不需要调用类的实例。代替:

SimpleTest st = new SimpleTest();
st.test2(5);

您可以致电:

SimpleTest.test1(5);

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

这里已经提出了private static一个关于 的问题。要带走的重要部分是:

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

于 2013-01-23T20:28:20.040 回答
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在命名空间方面是最接近的。

于 2013-01-23T20:30:29.273 回答
0

在您的示例中调用test1frommain无需使用类名即可工作,因为test1它是与main. 如果您想调用test2from main,则需要先实例化该类的对象,因为它不是静态方法。

于 2013-01-23T20:33:29.513 回答
0

static表示该方法不与该类的实例相关联。

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

于 2013-01-23T20:28:31.850 回答
0

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

new SimpleTest().test2(5);
于 2013-01-23T20:34:07.613 回答
0

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

关于将私有方法设为静态,它比其他方法更具可读性。引擎盖背后并没有太大的区别。

于 2013-01-23T20:36:28.773 回答