【问题标题】:is there any difference between "invoking a static method with class name" and "invoking a static method with an object" in java?java中“使用类名调用静态方法”和“使用对象调用静态方法”之间有什么区别吗?
【发布时间】:2013-07-10 07:09:50
【问题描述】:

在 java 中,我们可以“使用类名调用静态方法”,也可以“使用对象调用静态方法” java中“使用类名调用静态方法”和“使用对象调用静态方法”有什么区别?

【问题讨论】:

标签: java static


【解决方案1】:

没有区别,但建议以静态方式调用 static 方法,即使用 ClassName。如果你不这样做,一般静态分析器会报错。

这里要理解的重要一点是static 方法是无状态的,因此使用实例调用它们会使阅读您的代码的人感到困惑。因为无论您使用什么实例调用static 方法,结果都将保持不变。这是因为static 方法属于一个类而不属于一个对象。

【讨论】:

  • 是的,就这样。混淆的典型例子是调用anotherThread.sleep()——当然,这是一个静态方法,所以调用线程(而不是anotherThread)将是休眠的。
【解决方案2】:

完全没有区别。但是由于静态方法处于类级别,因此您可以使用类名访问它们。尽管使用类对象调用它们是可能的,但它会造成混乱。如果每个对象的值都相同,为什么要为每个对象调用它们?

【讨论】:

    【解决方案3】:

    在内部,new ClassName().staticMethod(); 被视为ClassName.staticMethod()。所以没有区别。它只会引起混乱。 举个例子

    public class StaticDemo {
    
        static int staticVar = 10;
    
        public static void main(String [] args){
    
        System.out.println(new StaticDemo().staticVar);
        System.out.println(StaticDemo.staticVar);
    
        }
    
    }
    

    这个输出

    10
    10
    

    `

    即使你写了new StaticDemo().staticVar,它也会被认为是StaticDemo.staticVar所以根本没有区别,并且总是使用类符号来避免混淆。

    【讨论】:

      【解决方案4】:

      不,没有。除了可能的混淆...如果您使用实例访问它们,此类代码的读者无法可靠地将静态成员/方法与非静态成员/方法区分开来:

      public class X
      {
          public static final String foo = "foo";
          public static String bar() { return "bar"; }
      
          public static void main(final String... args)
          {
              final X x = new X();
              System.out.println(X.foo); // "foo"
              System.out.println(x.foo); // "foo" too -- same reference
              System.out.println(X.bar()); // "bar"
              System.out.println(x.bar()); // "bar" too -- same reference
          }
      }
      

      由于这很容易混淆,因此通常首选使用类来引用此类成员/方法。

      【讨论】:

        【解决方案5】:

        静态方法不会在 class 上运行。它们只是绑定到类而不是该类的成员。这意味着他们无权访问class 的任何non static 成员。除此之外,它们与non-static 方法没有太大区别。

        【讨论】:

          【解决方案6】:

          在 SCJP 指南中。举个例子:

          class Frog {
          static int frogCount = 0; // Declare and initialize 
          // static variable
          public Frog() {
          frogCount += 1; // Modify the value in the constructor
          }
          }
          class TestFrog {
          public static void main (String [] args) {
          new Frog();
          new Frog();
          new Frog();
          System.out.print("frogCount:"+Frog.frogCount); //Access 
          // static variable 
          }
          }
          

          但只是为了让它真正令人困惑,Java 语言还允许 您可以使用对象引用变量来访问静态成员

          Frog f = new Frog();
          int frogs = f.frogCount; // Access static variable 
          // FrogCount using f
          

          在前面的代码中,我们实例化了一个 Frog,给新的 Frog 赋值 对象指向引用变量 f,然后使用 f 引用 调用静态方法!但即使我们使用的是特定的 Frog 实例访问静态方法,规则没有改变。这 只是让您使用对象引用变量的语法技巧 (但不是它所指的对象)到达静态方法或 变量,但静态成员仍然不知道特定的 用于调用静态成员的实例。在 Frog 示例中, 编译器知道引用变量 f 是 Frog 类型,所以 Frog 类静态方法在没有意识到或关心的情况下运行 f 引用另一端的 Frog 实例。其他 换句话说,编译器只关心引用变量 f 的声明 作为类型的青蛙。

          希望对你有帮助

          【讨论】:

            猜你喜欢
            • 2013-07-21
            • 1970-01-01
            • 1970-01-01
            • 2011-07-11
            • 2012-11-02
            • 2021-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多