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呢?
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呢?
a.m1();
执行的是子类中的方法,而变量是依附编译期类型,也就是A,所以你根本就没有改变
所以static void m1()方法实际上没有被重写因为静态方法是属于类的,不是属于对象的
从静态方法的调用就可以看出
可以直接用类名+方法名去调用所以正确调用A类m1方法应该是
A.m1();这个时候你说A的子类把m1方法重写了,这有意义吗
a.m();
a.m1(); //这句话本身就有问题,编译器应该会给出提示呀,静态的方法不要用对象来调用!