有两个问题,一直没弄明白
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
[解决办法]
记住一点:java中继承不能覆盖 static 方法,所以你子类中定义和父类一样的方法,也不起作用的
[解决办法]
静态方法不会被继承。。。