有两个问题,一直没弄明白

浮-沉 2013-07-08 07:53:43
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?
...全文
174 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-07-09
  • 打赏
  • 举报
回复
静态方法不会被继承。。。
lkq_david 2013-07-09
  • 打赏
  • 举报
回复
记住一点:java中继承不能覆盖 static 方法,所以你子类中定义和父类一样的方法,也不起作用的
ilmlife 2013-07-08
  • 打赏
  • 举报
回复
引用 3 楼 melodyfair1971 的回复:
1.静态的方法不被重写,所以f.show()是他自己的方法 2.向上转型:变量不能被重写
+1
oh_Maxy 2013-07-08
  • 打赏
  • 举报
回复
其实也好区别: 静态方法虽然可以用obj.func()方式调用,更多还是ClassName.func()方式调用的。这里引用的类名是什么,替换下实例即可:f.show();静态方法之后,索引类型替换,就是Fuu.show(); 静态方法是一个类公用的,编译器发现是静态方法,也会用引用名这么替换掉对象句柄的。 (LZ可以做个demo试试,用反编译工具看看.class文件调用方法那行,是不是变成Fuu.show())
逍遥jc 2013-07-08
  • 打赏
  • 举报
回复
第一个可能是因为非静态方法可被子类覆盖,而非静态方法不能被子类覆盖的缘故。 第二个是因为成员变量总是访问编译时的类型,如Fuu f = new Zii(),编译类型是Fuu,运行类型是Zii.
melodyfair1971 2013-07-08
  • 打赏
  • 举报
回复
1.静态的方法不被重写,所以f.show()是他自己的方法 2.向上转型:变量不能被重写
浮-沉 2013-07-08
  • 打赏
  • 举报
回复
引用 1 楼 tlfu_12344 的回复:
lz上网找找类初始化顺序问题就知道,包括父子和静态的
我去找了 没弄明白 能解释下吗
花木兰1闪21A 2013-07-08
  • 打赏
  • 举报
回复
lz上网找找类初始化顺序问题就知道,包括父子和静态的

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧