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 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog