日期:2014-05-20  浏览次数:20729 次

有两个问题,一直没弄明白
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?

------解决方案--------------------
lz上网找找类初始化顺序问题就知道,包括父子和静态的
------解决方案--------------------
1.静态的方法不被重写,所以f.show()是他自己的方法
2.向上转型:变量不能被重写
------解决方案--------------------
第一个可能是因为非静态方法可被子类覆盖,而非静态方法不能被子类覆盖的缘故。
第二个是因为成员变量总是访问编译时的类型,如Fuu f = new Zii(),编译类型是Fuu,运行类型是Zii.
------解决方案--------------------
其实也好区别:
静态方法虽然可以用obj.func()方式调用,更多还是ClassName.func()方式调用的。这里引用的类名是什么,替换下实例即可:f.show();静态方法之后,索引类型替换,就是Fuu.show();

静态方法是一个类公用的,编译器发现是静态方法,也会用引用名这么替换掉对象句柄的。
(LZ可以做个demo试试,用反编译工具看看.class文件调用方法那行,是不是变成Fuu.show())
------解决方案--------------------
引用:
1.静态的方法不被重写,所以f.show()是他自己的方法
2.向上转型:变量不能被重写


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