2012-11-14 25 views
2

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

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的静态方法

这是StaticCall主

作为静态字段和方法属于类对象如何是一个能够调用静态方法的实例吗? 何时创建了Class对象,它是第一次访问它的任何字段或方法吗?

+2

编译器知道类型。 –

+0

@Nambari因为编译器知道类型。 –

回答

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); 
+2

+1 for h = null;例。可能是你可以添加更多的描述,它是使用Type? – kosa

+0

简洁明了的答案。谢谢 – bl3e

+1

我认为它使用h的编译时类型恰好是MyMainClass – bl3e

4
h.main(arr);   //How is an instance able to call a static method? 

这仅仅是MyMainClass.main(arr)的快捷方式,即静态类型的h。这个用法经常被忽视,大多数IDE都会推荐你使用类型而不是实例。

因为这发生在编译时,h可以为空

1

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