【问题标题】:What is the purpose of static keyword in this simple example? [duplicate]在这个简单的例子中,静态关键字的目的是什么? [复制]
【发布时间】:2013-01-07 11:09:01
【问题描述】:

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

通常在为类编写静态方法时,可以使用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

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

【问题讨论】:

标签: java static


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    您可以参考This thread 了解有关静态成员的更多信息。

    【讨论】:

    • 谢谢!这有助于我更好地理解它
    【解决方案3】:

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

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

    你可以打电话:

    SimpleTest.test1(5);
    

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

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

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

    【讨论】:

      【解决方案4】:

      static 表示该方法与该类的实例没有关联。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我说的对吗?类中的任何静态方法都可以在类中的任何其他静态方法中使用,而无需使用类名?另外,如果我说 this.test1(5) 或 SimpleTest.test1(5) 会被认为是有效的吗?
        • 我没有测试过这些情况,但这是我的假设:是的,你可以在没有类名的类中使用任何其他静态方法,只要该方法名不意味着在你所在的方法的上下文中,我会使用类名和方法以确保安全和清晰(SimpleTest.test1(5))。我不相信 this.test1(5) 会起作用,因为“this”在这种情况下并不指代任何东西。没有 SimpleTest 对象。
        【解决方案6】:

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

        new SimpleTest().test2(5);
        

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

            关于可见性,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 在命名空间方面最接近。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-11-17
              • 2019-04-27
              • 2019-09-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多