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

时间:2014-07-09 06:19:20

标签: 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");    
    }    
}

12 个答案:

答案 0 :(得分:12)

不,这不正确。

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

执行类main()时会调用

Test

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

static
{
    //code here
}

在执行main()方法之前加载一个类,因此它的静态初始化程序在main()方法之前运行。以下代码段将清楚说明。

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

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

答案 1 :(得分:6)

让我详细解释一下

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

  1. 实例方法
  2. 班级方法
  3. 实例方法属于对象,您始终需要一个对象/实例来调用此类方法。

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

    例如,

    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.
        }
    }
    

    **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");
         }
    }
    

    输出将是

    静态

答案 2 :(得分:4)

main()方法未执行,因为它是 static ,因为它是任何Java程序的Entry Point,所以它会执行。如果你想要运行某些东西,你需要从main方法中调用它。执行类时,不会自动调用其他方法。

答案 3 :(得分:4)

完全没有。只有当特定类作为入口点运行时,main方法才会运行。

met()方法在调用之前不会运行。它与实例方法的主要区别在于,您不需要创建类的实例来运行它,您只需在类本身中运行它:Test.met();

你的意思是静态阻止:

private static String description;

static{
  description = "this runs on loading the class";
}

答案 4 :(得分:3)

您可以使用static block代替静态方法,在这样的主方法之前打印 -

public class Test
{

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

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

}

答案 5 :(得分:2)

如果您想在加载时执行,只需将其初始化为static阻止,

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

因为类加载后会执行静态块。除其他静态方法main()具有高优先级

答案 6 :(得分:1)

没有静态方法只会在你调用它时被调用,你是混合静态初始化器和静态方法

它打印main,因为当您运行Java应用程序时,它会调用main()方法

答案 7 :(得分:1)

程序运行时,默认情况下不会调用所有静态方法。

来自文档

The java tool launches a Java application. It does this by starting a Java runtime environment, loading a
specified class, and invoking that class's main method. The method declaration must look like the following:

  **public static void main(String args[])**

因此,main将由JVM调用,有人应调用met()以便执行它。

答案 8 :(得分:1)

met()是一个静态方法,在加载类时它将在内存中,你需要调用它。你可以使用static block来打印“方法”。

答案 9 :(得分:1)

静态方法,静态块和静态变量之间存在差异。由于您没有调用静态方法,因此不会打印

要进行打印,您需要拨打Test.met ();

或者,您可以将其设置为静态块

,如

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

加载Test后立即调用。

答案 10 :(得分:1)

Main()仅在执行时执行,因为它是入口点。

有关详细信息,请read the documentation

答案 11 :(得分:1)

你理解的是错的。因为每当类加载JVM创建类类对象和int类类对象时,所有静态方法都驻留。 main方法是JVM的入口点,它为什么执行它,JVM内部调用Main方法。每当Class加载该时间时,它只执行静态内化块。