class A{
int i=1;
static int j=3; void m(){
i=5;
} static void m1(){
j=7;
}
}
class B extends A{
int i=2;
static int j=4; void m(){
i=6;
} static void m1(){
j=8;
}
}
public class Test{
public static void main(String[] args){
A a = new B();
a.m();
a.m1();
System.out.println(a.i);
System.out.println(a.j);
}
}请问为什么输出的a.i为1而不是5呢?

解决方案 »

  1.   

    a.m(); 
    a.m1();
    执行的是子类中的方法,而变量是依附编译期类型,也就是A,所以你根本就没有改变
      

  2.   

    注意,静态方法是不能够被重写的
    所以static void m1()方法实际上没有被重写因为静态方法是属于类的,不是属于对象的
    从静态方法的调用就可以看出
    可以直接用类名+方法名去调用所以正确调用A类m1方法应该是
    A.m1();这个时候你说A的子类把m1方法重写了,这有意义吗
      

  3.   

    意思是说,因为是静态方法,a.m1()是调用的父类的m1(),而a.m()是调用子类的m(),所以a.i并没有被重新赋值,对吧
      

  4.   

    A a = new B(); 
    a.m(); 
    a.m1();  //这句话本身就有问题,编译器应该会给出提示呀,静态的方法不要用对象来调用!