java 继承调用_【JAVA学习】继承中函数调用机制

类(类的对象)在调用函数时,究竟哪一个函数被调用,是存在特定的机制的,现在我们来梳理下其步骤。

步骤一:当其调用一个函数的时候,编译器根据其声明的变量类型和调用的函数名字找到所有此“类”和其父类中具有同名的函数

Class A{public void getName(inta){

System.out.println("This is Class A and integer is " +a);

}

}

Class BextendsA{public void getName(inta){

System.out.println("This is Class B and integer is " +a);

}public void getName(doublea){

System.out.println("This is Class B and float number is " +a);

}public static voidmain(String[] args){

B b= newB();

b.getName(3.14);

A a = newB();

a.getName(3.14);

} }

首先,根据步骤一,变量b声明的类型为B,其中与b调用函数同名的函数有两个,分别为getName(int a)和 getName(double a),同时A作为B的父类,有一个访问修饰符为public,既子类可以访问且与变量b同名的函数getName(int a)。此时,经过步骤一筛选之后,变量b所调用函数的候选者有如下几个:

A:

getName(inta)

B:

getName(inta)

getName(double a)

步骤二:编译器根据传入参数类型选择最合适的函数。所以b最合适的函数为public void getName(double a)

步骤三:值得留意的是,如果此函数前有private , static ,final修饰或者方法是构造函数,根据静态绑定(static binding)原则,根据其显示声明的变量类型可以直接确定所调用的函数。与之相对的是动态绑定(dynamic binding),意思即是当程序运行时,程序会

找到变量指向的实际对象,获取其实际类型。再确定其调用的函数。

一个程序中,一般都会存在大量的函数调用,如果每一次调用都从零开始搜索,无疑会消耗大量的时间。因此,JVM会预先计算出每一个类的函数调用表(method table),如下所示

A:

getName(int ) -> A.getName(int)

B:

getName(int ) -> B.getName(int)

getName(double ) -> B.getName(int)

此表包含了每一个类可以调用的函数(无论其是自己的函数还是父类的函数,只要调用都需要纳入此表)。当JVM确定了函数实际类型时,按此表用以上步骤进行查找调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang 反射

参考:|--http://blog.51cto.com/speakingbaicai/1707637 |--https://studygolang.com/articles/6324 反射是在golang程序运行时检查变量所具有类型的一种机制。由于反射可以得出关于变量结构的数据(即“关于数据的数据”),所以这也…

java硬件编程_关于JAVA并发编程你需要知道的——硬件篇

无论程序语言如何千变万化,他们都深深地根植于目前的计算机体系结构。左图是intel CPU的三级高速缓存设计,由于高速缓存对程序员基本不可见,因此可以抽象为右图。缓存的设计首先还是先谈谈左图。L1-cache分为两部分,i-cache存储指…

ELF 动态链接 so的动态符号表(.dynsym)

静态链接中有一个专门的段叫符号表 -- “.symtab”(Symbol Table), 里面保存了所有关于该目标文件的符号的定义和引用。 动态链接中同样有一个段叫 动态符号表 -- “.dynsym”(Dynamic Symbol) , 但.dynsym 相对于 .symtab 只保存了与动态链接相关的导入…

java线程池怎么创建_java中的线程池,如何创建?

Java中的线程池它是线程的容器,或者(换句话说,它是具有执行任务能力的线程的集合)。我们可以使用ThreadPool框架来定位(或实现)线程池。线程池可以包含多个线程。每当我们执行任何任务时,线程就会从线程池中出来并完成该任务,然后…

JAVA 基础3-数组

一.数组的概念 数组可以看成是多个数据类型的集合,是对这些数据进行统一的管理; 数组的变量是引用类型,数组本身是对象,数组中的每个元素相当于该对象的成员变量; 数组的元素可以是任何数据类型,包括基础数…

net Core做一个webApi的简单实例

用NetCore 和Dapper 和mySql做一个简单的实例, 一准备工作 1:VS2017windos系统,也可以用其他的操作系统和工具 2:一台Cenetos的虚拟机或者虚拟机 二:开始 1:用微软官方的netCore的ToDo项目改造,…

mysql binlog sql统计_mysql的binlog详解

binlog是mysql记录操作的二进制日志文件,有三种格式可选,但是老旧的SBR已经不适合现在大多数业务需求,所以大多数都建议用MBR和RBR,即mixed或row,而解析他的原因,几乎都只有一个,就是恢复数据库,或者是反编译来恢复数据库,目的都是一样.以下是基于mysql5.6的mysqlbinlog来描述的…

Android项目实战(二十二):启动另一个APP or 重启本APP

Android项目实战(二十二):启动另一个APP or 重启本APP 原文:Android项目实战(二十二):启动另一个APP or 重启本APP一、启动另一个APP 目前公司项目需求,一个主APP,需要打开某些小APP&#xff0c…

mysql 查询两张表结构相同的数据库_利用反射处理多个表结构相同的数据的查询和数据库表的关联...

最近做一个项目,需要对人口数据进行查询,但是人口数据分布在不同的街道表中,首先进行了数据表结构的统一,每个数据表以街道名开头,然后其他的名字都一样前期将各个表中的字段也进行了统一抽象出一张字典表将街道编号和…

oracle批量update

我个人觉得写的很好 http://blog.csdn.net/wanglilin/article/details/7200201 需求: 将t2(t_statbuf)表中id和t1(T_Mt)表相同的记录更新进t1表。 1.错误的写法: 1 update table_name t1 set (a,b,c)( select a,b,c from table_name_2 t2 where t1.at2.a…

java 文件输出流_Java 文件输出流

Java IO教程 - Java文件输出流创建输出流要写入文件,我们需要创建一个FileOutputStream类的对象,它将表示输出流。// Create a file output streamString destFile "test.txt";FileOutputStream fos new FileOutputStream(destFile);当写入文…

Docker自动补全容器名

Zsh Place the completion script in your /path/to/zsh/completion (typically ~/.zsh/completion/): 下载自动完成文件mkdir -p ~/.zsh/completion curl -L https://raw.githubusercontent.com/docker/compose/1.21.0/contrib/completion/zsh/_docker-compose > ~/.zsh/co…

java 打印 模板_Java输入输出模板

常规输入输出绝壁有毒~import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigDecimal;import java.math.BigInteger;import java.util.StringTokenizer;public class Main {public static void main(St…

MySQL5.7参数log_timestamps

最近测试MySQL 5.7.21 Community Server这个版本的MySQL数据库时,发现其错误日志的时间跟系统当前时间不一致,后面检查发现日期时间格式都是UTC时间,查了一下相关资料,原来在MySQL 5.7.2 之后日志文件里面的时间戳从默认的本地系…

java非堆内存_java – 监视JVM的非堆内存使用情况

我们通常处理OutOfMemoryError问题,因为堆或permgen大小配置问题。但是所有的JVM内存不是permgen或者heap。据我所知,它也可以与Threads / Stacks,本地JVM代码相关…但是使用pmap我可以看到进程分配了9.3G这是3.3G堆外内存使用。我不知道什么…

.net core HttpContext(Http上下文)

在.NET Core中,只有Controller才能直接使用 HttpContext ,其他地方需要通过HttpContextAccessor来访问 转载于:https://www.cnblogs.com/87Super/p/8975311.html

Tidb集群加mysql_TiDB - 快速入门,集群搭建

TiDB 是开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 …

一个ssm综合小案例-商品订单管理-第二天

准确来说是第二三天,一时兴起,把这个小项目一鼓作气写完了(较大的bug 均已被我手动捉出并 fix )才来写一篇博客。 接上文 第一天配置继续讲解: 转载于:https://www.cnblogs.com/Frank99/p/8975378.html

java运行时读取注解_Java自定义注解和运行时靠反射获取注解

转:1、Annotation的工作原理:JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的class文件和一个注解处理工具…

python递归函数

递归函数简单来说就是函数的自我调用。使用递归函数很多时候可以使得代码简洁,优雅。可以把复杂的问题分解成简单的子问题。递归有无与伦比的魅力,从著名的计算机名言就可以看出递归的奇妙: To iterate is human,to recurse divine. 迭代者为…