java中的静态方法

san*_*hya 5 java static

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

pol*_*nts 17

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

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

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

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

public static void main(String args[]) {
  System.out.println(args.length);
}
Run Code Online (Sandbox Code Playgroud)

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

此外,printlnNOT一个静态方法; 它是实例的实例方法PrintStream.静态方法main能够通过访问静态字段得到这个实例out的类System.


总结一下:

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

此外,

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


Mih*_*ria 16

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

不.声明不正确.

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

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

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();
        //A.i = 5; //can use.  
        a.i = 5; // it should be non-capital "a" right?
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我修改以回答包括“如何在静态方法中访问非静态实例变量” (2认同)
  • "实例变量定义为静态"是不正确的.如果它们被定义为static,则变量被命名为类变量(静态变量)NOT实例变量.static方法直接访问类变量,可以通过实例处理程序访问实例变量. (2认同)