我对静态方法有疑问.在下面编写的程序中,输出将是: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)
方法类型基本上有两种方法,
实例方法属于对象,您始终需要一个对象/实例来调用此类方法.
静态方法是类方法,它们可以通过类名直接调用,不需要有类的实例来调用它们.
例如,
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)
输出将是
静态的
主要
一点也不。只有当该特定类作为入口点运行时,main 方法才会运行。
该met() 方法在被调用之前不会运行。它与实例方法的主要区别在于,您不需要创建类的实例来运行它,您可以简单地通过类本身运行它:Test.met();
你的意思是一个静态块:
private static String description;
static{
description = "this runs on loading the class";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7112 次 |
| 最近记录: |