最近遇到个问题(不常用的那种)让我对Java的重载和重写有点迷惑,请高手指正。代码和结果如下:
class Cat{}
class WhiteCat extends Cat{}
class BlackCat extends Cat{}
public class test {
public void feed(BlackCat cat){
System.out.println("feed BlackCat");
}
public void feed(Cat cat){
System.out.println("feed cat");
}
public void feed(WhiteCat cat){
System.out.println("feed WhiteCat");
}
public static void main(String[] args) {
Cat wc = new WhiteCat();
Cat bc = new BlackCat();
test p = new test();
p.feed(wc);
p.feed(bc);
}
输出的结果是:
feed cat
feed cat
有高手能详细的解释下 动态多单分配和静态多分配的实现机制么?比如重写,是在加载类的时候从基类往子类加载到栈中,找的时候从栈顶网栈底找,所以当方法名和参数一样的时候只找到子类就返回,基类的方法就被屏蔽了。(貌似不完整,有更明确的说明吗)那动态多分配的情况是怎么实现呢?
问题补充
恩,好好研究研究
问题补充
有点明白了,传进来的参数,不是看class本身的类型,而是看指引的类型。不过静态多分配和动态单分配的问题还是有疑惑,希望有高手继续指点。另外谢谢楼上的

提问,Java的重载和重定义的底层实现原理是什么
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
7条回答 默认 最新
- NickACM 2010-11-05 08:45关注
其实这个和java语言本身的性质有关:对于重载,是编译时静态绑定的。所以
Cat wc = new WhiteCat();
p.feed(bc);
wc定义的类型是Cat,编译的时候绑定到了 public void feed(Cat cat)
而多态是动态绑定,即运行时确定,所以WC,BC的同一个方法会有不同的行为:如:
class Cat{
public void fun(){
System.out.println("Cat");
}
}
class WhiteCat extends Cat{
public void fun(){
System.out.println("Whilte Cat");
}
}
class BlackCat extends Cat{
public void fun(){
System.out.println("Black Cat");
}
}
Cat wc = new WhiteCat();
wc.fun();
输出;Whilte Cat用一个比喻吧(C)
静态绑定发生在编译的时候,而且绑定的值是一个指向函数的地址
动态绑定,由于行为的不确定性,编译时绑定的是一个函数指针
这也是C中有函数指针的作用,可以实现多态
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报