2

如果在编译时解析静态方法,对象实例如何能够调用静态方法?

class StaticCall
{
    public static void main(String[] args)
    {
        String arr[]={"Class StaticCall","calls static method of class MyMainClass"};

        MyMainClass h=new MyMainClass();
        h.main(arr);         //How is an instance able to call a static method?
        System.out.println("this is StaticCall main");  
    }   

}


class MyMainClass 
{
    public static void main(String[] args){
        System.out.println(args[0]+" "+ args[1]);
    }
}

运行 StaticCall 类后,输出为

类 StaticCall 调用类 MyMainClass 的静态方法

这是静态调用主

由于静态字段和方法属于 Class 对象,实例如何能够调用静态方法?另外,什么时候创建 Class 对象,它是第一次访问它的任何字段或方法吗?

4

3 回答 3

14

实例如何能够调用静态方法?

它没有。试试这个

MyMainClass h = null;
h.main(arr);   

您会看到该实例被忽略,因为这与

MyMainClass.main(arr);   

扩展你的例子......如果你有

class AnotherMainClass extends MyMainClass 
{
}

然后所有以下调用相同的方法。

AnotherMainClass amc = null;
amc.main(args);

((AnotherMainClass) null).main(args);

AnotherMainClass.main(args);

MyMainClass mmc = null;
mmc.main(args);

((MyMainClass) null).main(args);

MyMainClass.main(args);
于 2012-11-14T16:35:25.030 回答
4
 h.main(arr);         //How is an instance able to call a static method?

这只是 . 的一种快捷方式MyMainClass.main(arr),即 . 的静态类型h。这种用法通常不受欢迎,大多数 IDE 会建议您使用类型而不是实例。

由于这发生在编译时,h可以为 null

于 2012-11-14T16:36:20.113 回答
1

您可以通过内部调用classname.staticMethod甚至调用静态方法。instance.staticMethodinstance.staticMethodclassname.staticMethod

于 2012-11-14T16:36:22.143 回答