java中的静态方法

我听说静态方法应该只使用java中的静态变量。 但是,主要方法也是静态的,对吗?

你的问题:声明“静态方法应该只使用静态变量”是否正确?

不。声明不正确。

正确的语句将是“静态方法只能使用那些定义为静态的实例变量”

看看下面的代码并阅读评论:

 Class A{ int i; static int j; public static void methodA(){ i = 5; //cannot use since i is not static j = 2; //can use. int k = 3; //k is local variable and can be used no problem **EDIT:**//if you want to access i A a = new A(); //Ai = 5; //can use. ai = 5; // it should be non-capital "a" right? } } 

首先,技术性:“ main方法也是静态的” 并非如此。 您可以使用您选择的任何签名定义非静态main方法; 它只是一个有效的Java应用程序入口点。

关于“静态方法应该只使用静态变量”,这也不是真的。 这里的关键概念是静态方法和字段是特定于类的,而不是特定于实例的。 如果您实际上没有该类的实例,则根本无法访问实例变量/方法; 这是一个编译错误。

所以准确地说,如果没有实例,则无法访问实例字段/方法。 您可以在没有实例的情况下访问静态字段/方法。 如果需要从静态方法访问实例字段/方法,则必须以这种或那种方式获取该类的实例,方法是简单地实例化它,或者从静态字段或方法参数获取对它的引用。

我们来看看这个简单的例子:

 public static void main(String args[]) { System.out.println(args.length); } 

length 不是静态场; 它是数组实例的实例字段, args是。 静态方法main能够获取此实例(从而访问其实例方法和字段),因为它作为参数传入。

另外, println 不是静态方法; 它是PrintStream实例的实例方法。 静态方法main能够通过访问类System的静态字段来获取此实例。


总结一下:

  • Java应用程序入口点是一种方法:
    • 被命名为main
    • publicstatic
    • 返回void并将String[]参数作为参数
  • 名为main的方法不必是Java应用程序入口点
    • (但最好为此目的保留此名称)

此外,

  • 实例字段/方法只能通过实例访问
  • 可以在没有实例的情况下访问静态字段/方法
  • 静态方法可以通过以下方式之一获取类的实例:
    • 创建一个new实例
    • 让它作为一个参数传递
    • 通过类的static字段访问它
    • 接受它作为类的static方法的返回值
    • 把它当作抛出的Throwable

要访问非静态字段(实例变量),您需要拥有一个实例。
在非静态方法中, this用作默认实例:

 class AnyClass { private String nonStaticField = "Non static"; void nonStaticMethod() { this.nonStaticField = "a text"; // accessing field of this nonStaticField = "a text"; // same as before } } 

在静态方法中,没有this用作默认实例,但是如果你提供实例,你仍然可以访问实例变量:

 class AnyClass { private String nonStaticField = "Non static"; static void staticMethod() { AnyClass example = new AnyClass(); example.nonStaticField = "new value for non-static field"; } } 

1 – Java的访问控制也必须可以访问该字段(声明为public或在同一个类中……)

也许这段代码会启发你:

 public class Main { private String instanceField = "Joe"; private void instanceMethod() { System.out.println("Instance name=" + instanceField); } public static void main(String[] args) { // cannot change instance field without an instance instanceField = "Indy"; // compilation error // cannot call an instance method without an instance instanceMethod(); // compilation error // create an instance Main instance = new Main(); // change instance field instance.instanceField = "Sydney"; // call instance method instance.instanceMethod(); } } 

因此,如果没有实例,则无法访问实例成员。 在静态方法的上下文中,除非您接收或创建实例,否则您没有对实例的引用。

希望这可以帮助。

静态方法在类实例上调用,而不是在类的对象上调用。 这意味着,静态方法无法访问实例变量,因为它们仅在对象中实例化。

如果要使用静态方法访问实例变量,则必须将该变量声明为static。

 public class Test { private static int value = 0; public static void main(String[] args) { value++; } } 

但说实话,用静态方法编写所有东西并不是最好的主意。 最好使用main方法实例化新对象。

一个重要的事情是,除非你创建一个类的实例,实例变量实际上并不存在,这意味着JVM不会像int我那样使用变量,除非你为该类创建一个实例。 因此,在静态方法中使用实例变量是编译错误。

 class A{ int i; static int j; static int b(){ i=10; // cannot be found A a= new A(); ai=10;//can be found in a's instance } } 

但是,我们可以在实例方法中使用实例变量,因为实例方法仅在创建对象时调用,因此在其中使用实例变量没有问题。

希望你清楚这些事情!

是静态方法不能直接调用类的非静态方法或变量。

编辑 :可以创建任何局部变量。

静态方法无法访问外部的非静态变量,因为您可以在没有类初始化的情况下使用静态方法,但它不适用于非静态外部变量。 但是您可以在静态方法中定义和使用非静态变量。