class Fuu{
int num = 3;
public void show(){
System.out.println("fu show");
}
}
class Zii extends Fuu{
int num = 4;
public void show(){
System.out.println("zi show");
}
}
public class DuoTai { public static void main(String[] args) {
Fuu f = new Zii();
f.show();
System.out.println(f.num); }}
class Fuu{
int num = 3;
public static void show(){
System.out.println("fu show");
}
}
class Zii extends Fuu{
int num = 4;
public static void show(){
System.out.println("zi show");
}
}
public class DuoTai { public static void main(String[] args) {
Fuu f = new Zii();
f.show();
System.out.println(f.num); }}
1、show()方法在没加static关键字前,输出结果是zi show,加了之后变成了fu show求解为什么
2、f.num 的值为什么是3不是4?

解决方案 »

  1.   

    1.静态的方法不被重写,所以f.show()是他自己的方法
    2.向上转型:变量不能被重写
      

  2.   

    第一个可能是因为非静态方法可被子类覆盖,而非静态方法不能被子类覆盖的缘故。
    第二个是因为成员变量总是访问编译时的类型,如Fuu f = new Zii(),编译类型是Fuu,运行类型是Zii.
      

  3.   

    其实也好区别:
    静态方法虽然可以用obj.func()方式调用,更多还是ClassName.func()方式调用的。这里引用的类名是什么,替换下实例即可:f.show();静态方法之后,索引类型替换,就是Fuu.show();静态方法是一个类公用的,编译器发现是静态方法,也会用引用名这么替换掉对象句柄的。
    (LZ可以做个demo试试,用反编译工具看看.class文件调用方法那行,是不是变成Fuu.show())
      

  4.   

    记住一点:java中继承不能覆盖 static 方法,所以你子类中定义和父类一样的方法,也不起作用的