在java中加载类时静态方法的初始化

use*_*874 5 java

我对静态方法有疑问.在下面编写的程序中,输出将是:main.我理解这是因为它main是一个静态方法,所以当类加载时,它会执行.如果是这样,同样的原则也应该适用met(),对吧?因为它也是静态的.为什么只main执行而met()在类加载时不执行?

public class Test {

    static void met() {
        System.out.println("method");    
    }

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

Rei*_*977 13

不,这不正确.

加载类时,不会调用这些方法.

main()在执行类时调用Test.

加载类时仅调用静态初始化程序.静态初始化器如下所示:

static
{
    //code here
}
Run Code Online (Sandbox Code Playgroud)

main()执行方法之前加载类,因此在main()方法之前运行其静态初始化程序.以下代码片段将清楚地表明这一点.

public class TestA
{
    static
    {
        System.out.println( "hello" );
    }

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


gpr*_*our 7

让我详细解释一下

方法类型基本上有两种方法,

  1. 实例方法
  2. 分类方法

实例方法属于对象,您始终需要一个对象/实例来调用此类方法.

静态方法是类方法,它们可以通过类名直接调用,不需要有类的实例来调用它们.

例如,

class Demo{
    public void sayHello(){
         System.out.println("Hello");
    }

    public static void sayHi(){
         System.out.println("Hi")
    }

    public static void main(String args[]){
          Demo.sayHi();    //Call to static/class method

          Demo.sayHello(); //It will not work

          Demo d = new Demo();
          d.sayHello();    //It will work.
    }
}
Run Code Online (Sandbox Code Playgroud)

**But NONE of them gets called automatically when class loads.**

两者之间的主要区别

在内存中,只有一个静态方法副本可用于所有对象.但是无论何时创建对象,都会为该对象创建一个新的实例方法副本,因此每个对象都有自己的实例方法.与实例和类变量类似.

静态方法并不意味着自动运行,而是由所有对象共享.为什么main()调用方法,因为它是程序的入口点.

除了它们之外,还有一个静态块,在加载类时只会自动调用一次.

class Main{
     static{
           System.out.println("static block");
     }

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

输出将是

静态的

主要


Cam*_*ron 5

main()方法不执行是因为它是静态的,它执行是因为它是任何 Java 程序的入口点。如果你想运行一些东西,你需要从 main 方法中调用它。执行类时不会自动调用其他方法。


Stu*_*ske 5

一点也不。只有当该特定类作为入口点运行时,main 方法才会运行。

该met() 方法在被调用之前不会运行。它与实例方法的主要区别在于,您不需要创建类的实例来运行它,您可以简单地通过类本身运行它:Test.met();

你的意思是一个静态块:

private static String description;

static{
  description = "this runs on loading the class";
}
Run Code Online (Sandbox Code Playgroud)