【问题标题】:how does the following code work以下代码如何工作
【发布时间】:2010-02-10 13:08:13
【问题描述】:

目前我正在尝试像这样调用它:

class Test {
    public static void test() {
        System.out.println("hi");
    }
    public static void main(String[] args) {
        Test t = null;
        t.test();
    }
}

代码的输出是hi

【问题讨论】:

  • 您能否使用“代码”格式重新格式化您的问题?
  • 请注意,如果您将 Test t = null; 更改为 Test t = new Test();,您的代码将可以正常工作
  • @The Feast:它现在仍然有效,请参阅我对排名靠前的答案的评论。
  • 哇,我从来不知道 - 在这种情况下,编译器的优化方式可能会改变流程。
  • 也看看这个问题:stackoverflow.com/questions/2223386/…。通过实例调用静态方法只是一个语法技巧。他们应该禁止这样做,这只会带来混乱。

标签: java static methods invocation


【解决方案1】:

试试Test.test(),在点前加上类名。

在类本身而不是类的实例上调用静态方法。

【讨论】:

  • 但是可以在(非空)实例上调用它们,效果相同。 (虽然这不是可取的,因为它可能具有欺骗性。)
  • @FarmBoy:它们甚至可以在 null 实例上调用,效果相同,编译器会为你优化)
  • 没错。这怎么可能?下面发生了什么。
  • 存在一些反编译字节码的工具。你可以看看会发生什么。我不认为你可以在规范中找到相关的东西。但是每次通过类的实例调用静态方法时,编译器都会简单地将所有实例替换为类名。
【解决方案2】:

您不需要实例化 Test 来调用静态方法。你的主要可能是这样的:

public static void main(String[] args) {
    Test.test();
}

【讨论】:

    【解决方案3】:

    静态方法应该使用类名调用,而不需要创建类的实例,如

    ClassName.methodName(args);
    

    methodName(args); // from other static methods of the same class.
    

    您还可以使用对象引用来引用静态方法,例如

    instanceName.methodName(args)
    

    但不鼓励这样做,因为它没有明确说明它们是类方法。

    所以在你的情况下:

    Test.test();
    

    test();
    

    从main方法就可以了。

    【讨论】:

      【解决方案4】:

      试试:

      Test.test();
      

      【讨论】:

        【解决方案5】:

        你们是同班同学,可以直接从main()拨打test()

        【讨论】:

        • 因为它们在同一个类中而且这两个方法都是静态的...
        【解决方案6】:
        for (Method m : Class.forName ("Test").getDeclaredMethods ()) {
           if (Modifier.isStatic (m.getModifiers ()) {
              m.invoke (null);
           }
        }
        

        只为 lulz

        【讨论】:

          【解决方案7】:

          静态方法和静态变量的好处是你不需要类的实例来使用它。

          通常你会创建一个实例并调用方法

          Test myClass = new Text();
          myClass.test();
          

          但是对于静态方法,第一行不是必须的,你只需要在开头写上类名

          Test.test();
          

          但是,在静态方法中,您无法访问 Test 类中的任何实例变量 - 除非它们也是静态的!

          【讨论】:

          • Test.test() 工作正常。但是上面的代码 sn-p 也可以。我想知道它是如何工作的
          • 使用实例来引用静态方法不是好的做法。使用 Test.test() 而不是 myClass.test()。
          【解决方案8】:

          顺便说一句。代码工作正常,没有任何空指针异常 此代码打印 hi

          我想知道使用引用调用静态方法时内部会发生什么。

          【讨论】:

            【解决方案9】:

            之所以有效,是因为当使用引用调用静态方法时,引用未使用。编译器查看正在调用该方法的表达式的声明/静态/编译时类型,并使用该类型来查找静态方法。

            在变量上调用静态方法一无所获,而且你会迷惑那些认为正在发生多态调用的人。

            【讨论】:

              【解决方案10】:

              致电Test.test()。由于main 方法是static,并且在同一个类中,所以你也可以直接调用test()

              【讨论】:

                【解决方案11】:
                class Test { 
                    public static void test() { 
                        System.out.println("hi"); 
                    } 
                
                    public static void main(String[] args) { 
                        Test.test();
                    }
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-09-05
                  • 2016-10-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-08-18
                  • 2017-02-15
                  相关资源
                  最近更新 更多