前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaSE - 多态的本质

JavaSE - 多态的本质

作者头像
承苏凯
发布2020-07-24 10:02:35
3870
发布2020-07-24 10:02:35
举报
文章被收录于专栏:唯手熟尔

多态

**场景:**创建一个Animal类,有Dog和Cat类继承Animal类,并重写say( )方法,创建一个Woman类,该类有个Animal类型的成员变量和一个pet( )方法调用对应的say( )方法

代码语言:javascript
复制
package com.sukai.test01;

/**
 * 实现多态
 */
public class Animal {

    public static void main(String[] args) {
        Woman womanA = new Woman(new Cat());
        womanA.Pet();

        Woman womanB = new Woman(new Dog());
        womanB.Pet();

        Woman womanC = new Woman(new Animal());
        womanC.Pet();

    }

    public void say() {
        System.out.println("I am a animal");
    }
}

class Dog extends Animal {

    @Override
    public void say() {
        System.out.println("I am a dog");
    }
}

class Cat extends Animal {
    @Override
    public void say() {
        System.out.println("I am a cat");
    }

}

class Woman {
    private Animal animal;

    Woman(Animal animal) {
        this.animal = animal;
    }

    public void Pet() {
        animal.say();
    }
}
image-20200414160024374
image-20200414160024374

经发现,womanA.Pet();本质上调用的是运行时类的say()方法而不是引用类型的say()

探究多态的本质 - 动态绑定

Human human = new Man();虽然我们new的对象是一个Man()但是它调用的却是Animal()Say()方法

代码语言:javascript
复制
package com.sukai.test01;

public class Human {
    public static void main(String[] args) {
        Human human = new Man();
        human.Say();
    }

    public void Say() {
        System.out.println("I am a human");
    }

}

class Man extends Human {
    @Override
    public void Say() {
        System.out.println("I am a man");
    }
}

内存分析:

如图所示,首先在栈中创建一个变量,它指向Man这个对象,但是由于在调用构造方法时,是把human当成一个Human对象的引用传过来的,所以human只能指向Man对象里面的Human对象,那么现在我们调用human.say(),它就回去代码区中找say( )方法,现在它发现有两个Say( ),那么要调用哪一个呢?此时实际上在父类的内部有一个指向Say( )方法的指针,在程序运行期间,你new的是哪个对象,指针就指向哪个对象的Say( )方法,这就是动态绑定,通过这种动态绑定的方式就可以实现多态了

image-20200414160106733
image-20200414160106733

总结

总结动态绑定(多态):动态绑定是指在“执行期间”(而非编译期间)判断所引用的实际对象类型,根据其实际的类型调用其相应的方法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多态
    • 探究多态的本质 - 动态绑定
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档