我对此代码有疑问
public Car {
public static void m1(){
System.out.println("a");
}
public void m2(){
System.out.println("b");
}
}
class Mini extends Car {
public static void m1() {
System.out.println("c");
}
public void m2(){
System.out.println("d");
}
public static void main(String args[]) {
Car c = new Mini();
c.m1();
c.m2();
}
}
我知道多态不能用于静态方法,只能用于实例方法。而且覆盖对静态方法也不起作用。
因此我认为该程序应该打印出来:c,d
因为c调用了m1方法,但是它是静态的,所以它不能覆盖它并且它在类Mini而不是Car中调用方法。
这是对的吗?
然而,我的教科书说答案应该是:a,d
这是一个错字吗?因为我现在有点困惑。
请清除这一点,谢谢。
答案 0 :(得分:27)
因为c调用了m1方法,但是它是静态的,所以它不能覆盖它并且它在类Mini而不是Car中调用方法。
这完全是倒退。
c
声明为Car
,因此通过c
进行的静态方法调用将调用由Car
定义的方法。
编译器直接将c.m1()
编译为Car.m1()
,而不知道c
实际上持有Mini
。
这就是为什么你永远不应该通过这样的实例调用静态方法。
答案 1 :(得分:0)
在处理继承时,我遇到了同样的问题。我了解到,如果被调用的方法是静态的,那么它将从引用变量所属的类而不是实例化该类的类中调用它。
public class ParentExamp
{
public static void Displayer()
{
System.out.println("This is the display of the PARENT class");
}
}
class ChildExamp extends ParentExamp
{
public static void main(String[] args)
{
ParentExamp a = new ParentExamp();
ParentExamp b = new ChildExamp();
ChildExamp c = new ChildExamp();
a.Displayer(); //Works exactly like ParentExamp.Displayer() and Will
call the Displayer method of the ParentExamp Class
b.Displayer();//Works exactly like ParentExamp.Displayer() and Will
call the Displayer method of the ParentExamp Class
c.Displayer();//Works exactly like ChildExamp.Displayer() and Will
call the Displayer method of the ChildtExamp Class
}
public static void Displayer()
{
System.out.println("This is the display of the CHILD class");
}
}