如何在java中解析对静态方法的调用?

如何在java中解析对静态方法的调用?,java,static,Java,Static,如果在编译时解析静态方法,那么对象实例如何能够调用静态方法 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);

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

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 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]);
    }
}
没有。试试这个

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);
这只是
MyMainClass.main(arr)
的快捷方式,即
h
的静态类型。这种用法通常不受欢迎,大多数IDE都会建议您使用类型而不是实例


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

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

编译器知道类型。@Nambari,因为编译器知道类型。+1表示h=null;例子。也许你可以添加更多的描述,它使用的是类型?我认为它使用的是编译时类型h,恰好是MyMainClass