为什么下面的代码打印“主”?
public class Main
{
public static void method()
{
System.out.println("Main");
}
public static void main(String[] args)
{
Main m = new SubMain();
m.method();
}
}
class SubMain extends Main
{
public static void method()
{
System.out.println("SubMain");
}
}
在运行时, m
指向的实例Submain
,所以应该在概念上打印“SubMain”。
静态方法是变量的编译时类型解析。 m
的类型是Main
,所以在该方法中Main
被调用。
如果您将其更改为SubMain m ...
,然后在方法SubMain
将被调用。
这是因为静态方法是不多态性。 此外静态方法应当通过对象,但使用类,即不调用Main.method()
或SubMain.method()
当你调用m.method()
的java实际上调用Main.method()
因为m是类型主要的。
如果你想享受多态性不使用静态方法。
Eclipse中给了我这种警告,当我尝试做这样的事情:
静态方法XXX()从类型XXX应以静态方式进行访问
静态方法不参加继承。 该变量的类型的Main
,所以编译器解决您的函数调用Main.method()
为了增加乐趣,可以尝试设置m
到null
。
执行的Java静态方法,不像实例方法,其是动态绑定早期绑定。
因为你的对象变量的类型主要的号召,势必在编译时的超类实现。
一个很好的解释,请点击这里 。
静态方法是静态与他们的类名绑定,因为m是类型主类,然后编译后它会看起来像如下Main.method(); 你的类的编译运行以下命令的javap -c主后ü可以看到主类JVM的汇编代码和u会看到以下m.method //调用静态调用静态,调用特殊告诉静态绑定调用特殊,调用接口告诉该动态绑定