我对静态方法有疑问。在下面编写的程序中,输出将是: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");
}
}
答案 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)
方法类型基本上有两种方法,
实例方法属于对象,您始终需要一个对象/实例来调用此类方法。
静态方法是类方法,它们可以通过类名直接调用,不需要有一个类实例来调用它们。
例如,
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加载该时间时,它只执行静态内化块。