iteye_4550 2010-11-05 16:45
浏览 356
已采纳

提问,Java的重载和重定义的底层实现原理是什么

最近遇到个问题(不常用的那种)让我对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本身的类型,而是看指引的类型。不过静态多分配和动态单分配的问题还是有疑惑,希望有高手继续指点。另外谢谢楼上的

  • 写回答

7条回答 默认 最新

  • NickACM 2010-11-05 16: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中有函数指针的作用,可以实现多态

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办