【问题标题】:Java Static [duplicate]Java静态[重复]
【发布时间】:2010-10-01 18:09:37
【问题描述】:

重复What does the 'static' keyword do in a class?


我已经阅读了this post

方法中的“static”关键字有什么作用?

我记得有人告诉我 static != 紧贴...但这几乎就是我对这个关键字的全部了解。

【问题讨论】:

  • 这是一个初学者的问题,但我认为这是很多初学者的症结所在,如果有人愿意,可以以非常技术性的方式回答,这将受益更多直接java人。 +1
  • 参见 Oracle 的 Java 教程中的 Understanding Class Members

标签: java static methods keyword


【解决方案1】:

静态类变量可以被认为是一个全局类。不管你有多少类的实例,每个静态变量只有一个实例。

静态方法不使用任何非静态类变量,它们可以直接从类外部调用,而无需实例化类本身。

【讨论】:

    【解决方案2】:

    静态变量和方法属于类而不是实例,尽管您可以从实例引用中引用它们。通常,您使用类名称来访问它们。

    如果一个方法被声明为静态的,你不需要定义它的对象的实例来调用它。现在,您可能想知道何时会出现这种情况?考虑java的main方法

    public static void main(String[] args)

    为什么它被声明为静态的?这是因为为了启动你的程序,这个方法应该开始执行。而且,由于程序尚未初始化,因此您无法创建声明它的类的实例。因此,您需要将该类声明为公共的。而且,这个静态方法在类被加载到内存时被调用

    java 你的类名

    除此之外,静态方法用于修改静态变量。他们不能操纵非静态实例变量。

    另外,请注意,静态在另一种语言(如 C)中具有不同的含义。

    【讨论】:

      【解决方案3】:

      静态方法是为建立的方法。它不需要(也没有)this 指针,也无法访问实例数据。所以你可以写一些东西

      public class Hello {
      
          void instanceHello() {
               System,out.println("Hello from the instance.");
          }
      
          public static void main(int argc, String[] argv){
               // The main method is defined even though there are no instances
               System.out.println("Hello from main.");
               instanceHello();  // but this is a syntax error;
               Hello h = new Hello();
               h.instanceHello();  // this isn't though 
          }
      }
      

      【讨论】:

        【解决方案4】:

        方法中静态变量的值存储在对该方法的调用之间

        
        
        public void method() {
          static int callCount = 0;
          callCount++;
          System.out.println("Calls: " + callCount);
        }
        
        method(); // "Calls: 1"
        method(); // "Calls: 2"
        method(); // "Calls: 3"
        
        

        请注意,这与静态方法完全不同。在定义它的类上调用静态方法,而不是此类的实例。

        
        
        class MyClass {
          public static void staticMethod() { ... }
          public void nonStaticMethod();
        }
        
        Myclass.staticMethod();
        
        MyClass instance = new MyClass();
        instance.nonStaticMethod();
        
        

        【讨论】:

        • 可能需要注意哪些语言支持方法中的静态变量。例如,Java(当前)不支持它。
        【解决方案5】:

        静态方法属于定义它的类,而属于该类的对象的实例,就像非静态方法一样。作为不属于类实例的副作用,尝试访问静态方法中的非静态字段是编译错误。静态方法没有“this”来访问非静态字段。

        Java Math 类就是一个很好的例子,因为它加载了静态方法。您永远不会创建 Math 类的实例,您只需直接从该类中调用方法。

        Math.abs(3.14);
        

        【讨论】:

          猜你喜欢
          • 2011-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-30
          • 2011-02-25
          • 1970-01-01
          • 2011-06-02
          • 1970-01-01
          相关资源
          最近更新 更多