Java学习13:面向对象-多态(Polymorphism)内存分析图解

2023-11-20

1.概述

多态是Java面向对象三大特征之一。
多态(Polymorphism),顾名思义,即对象具有多种形态。具体而言,是编译时类型、运行时类型

  • 编译时类型:由声明时的类型决定。一般是父类。
  • 运行时类型:由实际对应的对象类型决定。具体是哪个子类就是哪个子类。

多态性是OOP中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。对于大型系统来说能提高系统的灵活性和扩展性。

多态存在要有三个必要条件
要有继承、方法重写父类引用指向子类对象

2.代码分析

如下,我们通过一段代码进行演示,并进一步进行内存分析
首先创建一个Animal类,及其子类Cat和Dog,并重写Animal的talk方法:

public class Animal {
    public void talk() {
        System.out.println("yell...");
    }

}

class Cat extends Animal {

    @Override
    public void talk() {
        System.out.println("喵喵。。。");
    }

    public void catchMouse() {
        System.out.println("抓老鼠");
    }
}

class Dog extends Animal {
    @Override
    public void talk() {
        System.out.println("汪汪。。。");
    }

}

我们在这里建立一个测试类Test01,用于调用

public class Test01 {

    public static void testTalk(Animal a) {
        a.talk();
    }

    // 创建重载方法,传递Cat类型参数
    public static void testTalk(Cat c) {
        c.talk();
    }

    // 创建重载方法,传递Dog类型参数
    public static void testTalk(Dog d) {
        d.talk();
    }

    public static void main(String[] args) {
        Animal a = new Animal();
        Cat c = new Cat();
        Dog d = new Dog();

        testTalk(a);
        testTalk(c);
        testTalk(d);
    }

}

这是我们之前的做法,这样就存在一个问题,如果,我们还有其他类,比如Mouse等之类的继承Animal,这样就需要每个类都写一个重载方法,及其繁琐。


这段代码我们可以通过多态的方式实现,创建使用多态的测试类Test

public class Test {

    public static void testTalk(Animal a1) {
        a1.talk();

        if (a1 instanceof Cat) {
            Cat c = (Cat) a1;
            c.catchMouse();
        }
    }

    public static void main(String[] args) {
        Animal c = new Cat();
        testTalk(c);

        Animal d = new Dog();
        testTalk(d);
    }

}

接下来我们针对以上代码,进行内存分析。

3.内存分析

这里的核心代码只有三句话,我们主要分析如下三句即可。
如下,我们把Test类简化

public class Test {

    public static void testTalk(Animal a1) {
        a1.talk();

        if (a1 instanceof Cat) {
            Cat c = (Cat) a1;
            c.catchMouse();
        }
    }

    public static void main(String[] args) {
        Animal c = new Cat();
        Cat a = (Cat) c;
        testTalk(c);
    }

}

3.1加载Test类信息

对应图解步骤1.
注:事实上,在启动时,以上所有类的代码信息均被加载到了JVM中,这里便于理解,采用用到才加载的方式。
把Test的类信息加载到JVM中。

3.2 Animal c = new Cat();

3.2.1 把Animal的类信息加载到JVM中。

对应图解步骤2.

3.2.2 栈空间中生成局部变量c

对应图解步骤3.

3.2.3 调用Cat的构造器生成对象

这里需要指出的是:会首先加载该类的父类的信息,因而在这一步会:
1. 生成Object对象。
对应步骤4
2. 生成Animal类对象。
对应步骤5
3. 生成Cat类对象。
对应步骤6

此外,每个方法都会传递两个隐式参数,this和super。而这三个对象(Object、Animal、Cat对象)的super分别代表Object、Object、Animal对象。但是this指的全都是Cat对象。
关于this关键字,链接:this关键字详解
需要注意的是:图中的三个this指向的是同一个对象:最外层的对象。
关于super关键字,链接:super关键字详解

我们做个简单的实验说明这一点:
创建要给测试父类:

public class HttpServlet {
    public void service() {
        System.out.println("HttpServlet.service()");
        doGet();
    }

    public void doGet() {
        System.out.println("HttpServlet.doGet()");
    }

    public void goPost() {
        System.out.println("HttpServlet.goPost()");
    }
}

一个子类

public class Myservlet extends HttpServlet {

    public void doGet() {
        System.out.println("Myservlet.doGet()");
    }
}

一个测试类:

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HttpServlet s = new Myservlet();
        s.service();
    }

}

运行输出结果:

HttpServlet.service()
Myservlet.doGet()

可以看出,this始终指向最外围的对象

3.2.4 变量c指向Cat对象

3.3 Cat a = (Cat) c

栈空间生成局部变量a。把c指向的地址赋值给a,即a也指向该Cat对象。

3.4调用testTalk()方法

在该方法中,把c的地址指向传递给a1。

如下图:
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java学习13:面向对象-多态(Polymorphism)内存分析图解 的相关文章

随机推荐

  • 天池时间序列竞赛——AI助力精准气象和海洋预测学习笔记其一:赛题分析

    序 最近参加了天池的气象和海洋预测竞赛 希望能够借此机会学习时间序列的相关模型 接下来会通过系列博客记录并梳理自己在竞赛过程中的一些心得体会 作为系列学习笔记的第一章 这篇文章旨在梳理和分享我对赛题的一些理解 1 项目背景 问题陈述 这个竞
  • 二进制安全学习路线

    文章目录 更新状态 黑客成长日记 二进制安全学习精髓 The Journey part 0x0 Pogramming Part 0x1 Vuln research basics Part 0x2 Diving to the deep wat
  • MATLAB算法实战应用案例精讲-【回归算法】岭回归(Ridge Regression)(附MATLAB、Python和R语言代码)

    目录 前言 几个高频面试题 1 岭回归中alpha值的选取 2 如何解决过拟合和欠拟合问题
  • Query 聚类

    为了提高阅读体验 请移步到 Query 聚类 背景 搜索系统优化长尾 query 想了解一下长尾 query 长什么样 大体上都有几类 最好能归类 一类一类处理 Query 数据源 包含 什么 怎么 如何 关键词的 Query K mean
  • 数大雁(暴力解法)

    题目描述 一群大雁往南飞 给定一个字符串记录地面上的游客听到的大雁叫声 请给出叫声最少由几只大雁发出 具体的 1 大雅发出的完整叫声为 quack 因为有多只大雁同一时间嘎嘎作响 所以字符串中可能会混合多个 quack 2 大雁会依次完整发
  • windows7系统下mysql的安装(windows10同理)[]

    1 下载mysql安装包 我这里具体的版本是5 5 40的版本 win7 win10通用的 百度网盘永久链接如下 链接 https pan baidu com s 1lEYiWuflZZfFJiRQZtZLyg 提取码 k5sn 2 安装m
  • idea git详细使用

    https blog csdn net dreamsky boy article details 84098775
  • 【算法竞赛宝典】排名次

    算法竞赛宝典 排名次 题目描述 代码展示 代码讲解 题目描述 代码展示 求名次 include
  • MyBatis学习笔记整理详细

    MyBatis笔记 写在前面 欢迎来到 发奋的小张 的博客 我是小张 一名普通的在校大学生 在学习之余 用博客来记录我学习过程中的点点滴滴 也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获 希望大家多多关照 我们一起成长一起进步 也
  • STM32F103C8t6程序下载

    一 下载程序之前了解的内容 STM32英文手册下载 https www stmcu org cn document list index category 158 STM32的芯片上有两个管脚BOOT0和BOOT1 这两个管脚在芯片复位时的
  • 【NAS工具箱】Drop Path介绍+Dropout回顾

    前言 Drop Path是NAS中常用到的一种正则化方法 由于网络训练的过程中常常是动态的 Drop Path就成了一个不错的正则化工具 在FractalNet NASNet等都有广泛使用 Dropout Dropout是最早的用于解决过拟
  • 华为OD机试 - 最大社交距离(Java)

    题目描述 疫情期间需要大家保证一定的社交距离 公司组织开交流会议 座位一排共 N 个座位 编号分别为 0 N 1 要求员工一个接着一个进入会议室 并且可以在任何时候离开会议室 满足 每当一个员工进入时 需要坐到最大社交距离 最大化自己和其他
  • 第22章:python自动化——关键字驱动加Excel数据驱动案例

    目录 一 整个案例的要求 二 案例结构的设计 1 web keys py文件的内容 2 test data文件夹中excel测试用例数据准备 3 excel read py文件的内容 4 conf存放日志及其他的相关配置项 5 在main
  • scala判断类型

    isInstanceOf只能判断对象是否为指定类及其子类对象 而不能精确判断对象就是指定类的对象 如果要求精确的判断出对象的类型就是指定的数据类型 那么就只能用getClass和classOf来实现 对象 getClass可以精确获取对象的
  • 同学会后离婚观念的罪魁是什么?

    author skate time 2009 01 12 今天在网上看到这样一篇报道 老婆参加一次同学聚会 竟要离婚 现在的社会发展很快 可人们心理的适应能力没有跟上 换个角度想 这就是人的本性 不满足 就看自己怎么利用它 它是一把双刃剑
  • vscode的搜索技巧

    文章目录 vscode的搜索 搜索的方法 只搜索某些类型的文件 vscode在搜索的时候排除一些文件 vscode在搜索的目录中临时排除掉一些文件 在搜索中使用 ignore文件排除目录和文件 vscode的搜索 搜索的方法 只搜索某些类型
  • 第七周7.2搜索 课堂学习记录 搜索例子+选择排序+二分搜索《程序设计入门——C语言》第七期 浙江大学 翁恺

    1 搜索例子 include
  • python中文相似度_最准的中文文本相似度计算工具

    text2vec text2vec chinese text to vetor 文本向量化表示工具 包括词向量化 句子向量化 Feature 文本向量表示 字词粒度 通过腾讯AI Lab开源的大规模高质量中文词向量数据 800万中文词 获取
  • 数据中台外部演示脚本

    作为一个以产品 方案为主要核心的公司 公司员工本身对于产品一定是不陌生的 但是做产品演示光了解产品是不够的 需要自身对演示过程反复的练习 能够突出产品的亮点 要能够调动客户的兴趣 在演示产品的同时还需要对行业内其它相同的产品有所了解 在演示
  • Java学习13:面向对象-多态(Polymorphism)内存分析图解

    1 概述 多态是Java面向对象三大特征之一 多态 Polymorphism 顾名思义 即对象具有多种形态 具体而言 是编译时类型 运行时类型 编译时类型 由声明时的类型决定 一般是父类 运行时类型 由实际对应的对象类型决定 具体是哪个子类