1、多态机制的内存解析

1)、多态的三要素

*类之间具有相互继承关系;

*子类重写父类的方法;

*父类引用指向子类对象;

2)、为了更加细致深入的了解多态运行的机制,将下列代码的在内存中运行的简图绘制出来

测试代码-重点关注在子类中调用父类方法后,父类方法中引用了自身的方法speak()和子类中重写的方法speak(),那么会执行哪一个呢?

内存图,重点关注多态中子类、父类创建的顺序

解析:

Human Jack = new Man();

java中每一个子类中均存在一个隐藏语句,super(),位于第一句话的位置,作用是指向直接父类,调用父类构造器,以上代码中,new Man(),时会首先运行Man中的super(),语句,指向Human类,接着Human中super()方法启动指向Object类,创建Object对象,结束Object中的super()语句,再创建Human对象,结束Human中super()语句,最后创建Man对象,并将以上对象存储在同一块连续内存中,将地址赋给Jack(Jack由main方法在栈中创建);

Jack.read();

通过Jack调用read()方法,首先程序会从Jack对象中由Man部分创建的对象找起,如果没有找到read()方法,则向上查找一级,查找Human中是否存在read()方法,有则调用,无则继续向上,如果Object中也不存在read()方法时,程序会报错;

程序执行read()方法后,发现又调用了speak()方法,也开始从Man构造的部分查起,有则执行,无则继续向上。

*注意以上过程只针对子类中重写的方法,对于子类中特有的方法,必须通过强制类型转换才能调用

对象方法中的隐藏形参this、super

*this永远指向最终的类创建的对象,本例中,所有方法的this均指向Man创建的对象;

*super永远指向直接父类对象,Man指向Human,Human指向Object

2、抽象类

1)、为什么需要抽象类

抽象类的设计目的,是代码复用。当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象类。在这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给各个子类自己实现。正是因为A-B在这里没有实现,所以抽象类不允许实例化出来(否则当调用到A-B时,无法执行)。

2)、抽象类的语法格式

[public] abstract class ClassName {

[public] abstract void fun();

}

3)、抽象类的特点

*抽象方法必须为public或protected,缺省时为public

*抽象类不能实例化对象

*子类继承抽象类则必须实现抽象类中的抽象方法,否则必须将子类改为抽象子类

*Java中继承是单继承,一个子类只能继承一个类(抽象类或普通类)

*抽象类体现的是类的抽象,是对事物性质的抽象,是整体的抽象

3、接口

1)、为什么需要接口

接口的设计目的,是对类的行为进行约束(更准确的说是一种“有”约束,因为接口不能规定类不可以有什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。(这一句是copy知乎:阿法利亚大佬的话,我还没有搞得很明白!)

2)、接口的语法格式

[public] interface InterfaceName {

}

class ClassName implements Interface1,Interface2,[....]{

}

接口中变量默认修饰符是:public static final 不可更改

接口中方法修饰符默认为:public abstract 不可更改

3)、接口的特点

*接口是一种抽象的概念,比抽象类更加抽象

*一个类可以实现多个接口

*接口体现为行为上的抽象,是局部的抽象

java 内存接口_java中多态机制的内存解析、抽象类、接口相关推荐

  1. java 内存同步_Java中的硬件事务性内存,或者为什么同步将再次变得很棒

    java 内存同步 总览 硬件事务内存有可能允许多个线程同时以推测方式访问相同的数据结构,并使缓存一致性协议确定是否发生冲突. HTM旨在为您提供细粒度锁定的可伸缩性,粗粒度锁定的简单性以及几乎没有锁 ...

  2. java timestamp 使用_Java中针对Timestamp的操作解析

    Java中针对Timestamp的数据类型操作 数据库使用Oracle 10g 32位,存在一张表STU(学生表). 这里写图片描述 二.项目结构图 这里写图片描述 三.关键代码 Stu (bean) ...

  3. java 重力脚本_Java中非常简单的脚本解析器

    我目前正在用Java进行一个小项目,我需要为我组成的机器人处理非常轻量级的脚本语言. 它不需要处理算术或任何复杂的功能,它只需要运行某些命令并处理if和while语句. 它可能看起来像这样: turn ...

  4. java使用爬虫_Java中如何使用爬虫进行解析?

    我们都知道可以用爬虫来找寻一些想要的数据,除了可以使用python进行操作,我们最近学习的java同样也支持爬虫的运行,本篇小编就教大家用java爬虫来进行网页的解析,具体内容请往下看: 1.spri ...

  5. 零基础入门 自学 JAVA SE 基础篇(九)instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface)

    JAVA SE自学 基础篇 多态 instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface) 目标 父类型与子类型之间的转换及instanceo ...

  6. 操作系统核心原理-5.内存管理(中):分页内存管理

    在上一篇介绍的几种多道编程的内存管理模式中,以交换内存管理最为灵活和先进.但是这种策略也存在很多重大问题,而其中最重要的两个问题就是空间浪费和程序大小受限.那么有什么办法可以解决交换内存存在的这些问题 ...

  7. java中抽象类 接口_java中的抽象类与接口

    1.抽象类的定义 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 2.简单实例 ...

  8. java 内存 静态_java中内存分配以及static的用法(转)

    JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...

  9. java虚拟函数_java实现多态中的虚函数相关概念

    本文转载自参考博客 1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加上virtual关键字就成为虚函数 Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑 ...

最新文章

  1. 手把手搭建企业IT实战环境第三季:快速搭建SCCM1902服务器
  2. PMP-【第9章 项目资源管理】-2021-2-15(200页-219页)
  3. 虚幻填坑004:减少starter content占用空间,只保留使用的assets
  4. java同名过滤器_Gateway Redis令牌桶请求限流过滤器
  5. 超大型数据中心阻碍5G的正常发挥?
  6. QT学习:Qt操作数据库
  7. 数据结构五——二叉树
  8. 常用freemarker使用文档
  9. 如何使用Jemeter对HTTP接口压测
  10. 对话张潼 | 腾讯AI Lab周岁:规模飙至370人,要做后来居上的终结者
  11. Centos 7.2下安装php7
  12. Hive微博数据统计分析
  13. 子列和列_最大连续子列和问题 JAVA实现
  14. 悬赏任务源码系统带app小程序源码基于php开源版
  15. python 如何调试uc浏览器_UC浏览器开发者工具
  16. 格力董明珠还想再赌五年 雷军:可以试一下
  17. 三维重建 - Clion打包C++代码(包含qt库,opencv以及dcmtk)
  18. 社区论坛小程序开发制作(同城圈子小程序)
  19. CSS3变形、渐变、动画的基本使用
  20. ML之XGBoost:《XGBoost: A Scalable Tree Boosting System》的翻译与解读

热门文章

  1. 图片复印如何去除黑底_身份证复印机中间有黑线怎么办
  2. oracle字符串使用函数,oracle函数大全-字符串处理函数
  3. AngularJS基础入门初探
  4. 微信小程序-page
  5. DropDownList下拉绑定到GridView中实现功能
  6. 算法原理与分析第二次作业
  7. android EditText获取光标位置并安插字符删除字符
  8. 【项目分析】利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码
  9. 大数据可视化大屏图表设计经验,教给你
  10. 踩坑:VScode 集成 eslint 插件