多态?(不防看一下,也许你也搞不清楚哦!)
class Hello{
static void f1(){
f2();
}
static void f2(){
System.out.println("Hello.f2()");
}
}
class Hi extends Hello{
static void f2(){
System.out.println("Hi.f2()");
}
}
public class H3 extends Hi{
public static void main(String[] args){
Hello h = new H3();
h.f1();
}
}
结果:Hello.f2();
why?
问题点数:20、回复次数:12Top
1 楼xuliduo(实习牧师)回复于 2005-04-04 16:57:40 得分 1
你调用的是f1()方法啊,继承后还是调用Hello的f2方法嘛~Top
2 楼kingfish(工作很忙,很少来csdn...)回复于 2005-04-04 17:06:04 得分 5
static函数不存在override
哪来多态?Top
3 楼xuguopin(江湖人)回复于 2005-04-04 17:07:27 得分 5
静态方法是根据声明类型激发的,而不是实际类型Top
4 楼yunchenge(云沉阁)回复于 2005-04-04 17:08:54 得分 5
static 方法不是动态绑定的,而是在编译时就绑定了的!Top
5 楼leqixb(清然)回复于 2005-04-04 17:09:34 得分 0
Hi继承了Hello的f1(),怎么调用Hi的f1()?
Top
6 楼leqixb(清然)回复于 2005-04-04 17:11:37 得分 0
哇,刚刚才看到1条回复哎,原来跟STATIC有关,又愚蠢了一八,俺试试!谢了!Top
7 楼kingfish(工作很忙,很少来csdn...)回复于 2005-04-04 17:12:57 得分 0
static方法是类的,不是某个实例的(因此没有this指针,不可能执行时判断类型),所以编译时就根据声明的类型决定了调用那个方法。Top
8 楼zephyer(zephyr)回复于 2005-04-04 17:14:20 得分 3
一句话:静态方法没有多态。
理由:编译器不会为静态方法秘密传递this指针,多态就是根据这个this指针来实现的
要理解这些,需要深刻理解多态是如何实现的,以及静态方法
学习java就不一定非要追求这些细节了,Thingking in java都没有讲述这些细节,知道这个结论就可以了Top
9 楼leqixb(清然)回复于 2005-04-04 17:17:01 得分 0
晕,为什么结不了帖?Top
10 楼chenchen2003(晨辰)回复于 2005-04-04 17:17:30 得分 1
当类Hi在继承类Hello的时候,他覆盖了Hello中的f2方法,所以对于继承Hi类的H3
来说,他说看到的函数f2是(如果没覆盖Hello中的方法,那么H3继承的就是Hello中的f2方法)Hi类中的f2函数.
不知道我说清楚没有。多交流。Top
11 楼leqixb(清然)回复于 2005-04-04 17:26:41 得分 0
终于让我把贴给结了,本来一开始只有三位朋友,没想到才过了几分钟,一下子来了这么多朋友,只好把分匀匀分了,反正大家也不是冲着分来的,是吧,小女子在此谢过各位大虾了,多多帮助!Top
12 楼kingfish(工作很忙,很少来csdn...)回复于 2005-04-04 17:35:26 得分 0
更正一下我上面的一句话:
static函数不存在RTTI(存在override)
Top




