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

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

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确定了函数实际类型时,按此表用以上步骤进行查找调用。

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

  1. mllib java怎么调用_如何准备mllib中的训练数据

    ML LogisticRegression 尚不支持多项分类,但MLLib NaiveBayes 和 LogisticRegressionWithLBFGS 都支持它 . 在第一种情况下,它应该默认工 ...

  2. java 摄像头 win7_Win7系统下JAVA摄像头调用_实例代码介绍

    Win7系统下JAVA摄像头调用_实例代码介绍.由于要搞个人脸识别登录(JAVACV),百度谷歌了一下午,找了网上简单的样例代码来试,可是老是调试不过,出现CaptureDeviceManager.g ...

  3. java 数据源调用_实战分享: Spring boot 调用之间实现动态数据源

    需求: 根据项目部署在不同的域名,在同一套系统下,分别访问不同的数据库 (当然在看别人帖子的时候,也发现了不同接口访问不同数据源问题,就是分库动态数据源需求了,其实实现都一样) 业务描述: 部署的时候 ...

  4. java openresty 调用_玩转 OpenResty 协程 API

    注意:本文中列出的所有代码只是 Proof Of Concept,基本上都没有进行错误处理.另外对于一些边际情况,也可能没有考虑清楚.所以对于直接复制文中代码到项目中所造成的一切后果,请自负责任. O ...

  5. java 内存跟踪_详解JVM中的本机内存跟踪

    1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...

  6. proto文件支持继承吗_搞懂 Javascript中this 指向及继承原理

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的new 到底是干什么的 一.什么是 JS 原型链? 我们知道 JS 有对象,比如 var obj ...

  7. java编程学习方法_在线学习Java编程的最佳方法

    java编程学习方法 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好 ...

  8. java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息

    Jstack 用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息. 这里需要注意的是 Java 8 引入了 Java Mission Control, ...

  9. java reduce 分组_使用JAVA8 stream中三个参数的reduce方法对List进行分组统计

    背景 平时在编写前端代码时,习惯使用lodash来编写'野生'的JavaScript; lodash提供来一套完整的API对JS对象(Array,Object,Collection等)进行操作,这其中 ...

  10. java如何调用linux命令_java程序中如何调用linux命令

    java程序中如何调用linux命令 作为一个Java开发人员,有些常用的Linux命令必须掌握.即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令.因为很多服 ...

最新文章

  1. html 图片剪裁控件,h5图像裁剪(基于canvas)插件Image-Clip
  2. 科学家利用脑机接口让患者正常发声
  3. ubuntu18.04换清华源
  4. 团队行为心理学读书笔记(8)绩效考核背后的行为心理学
  5. atoi(s)函数用法
  6. 启动另一个activity
  7. SQL Server的下载和安装
  8. AI上推荐 之 xDeepFM模型(显隐性高阶特征交互的组合策略)
  9. 能源消耗总量计算公式_七、能源统计(21)
  10. TAOCP-Reading-计算机程序设计艺术阅读-1-0
  11. 商业模式丶商业模式画布丶商业模式画布个人版
  12. Mugeda(木疙瘩)H5案例课—教学课件如何做-岑远科-专题视频课程
  13. java dvr_java – 如何设置与DVR的连接并解码数据?
  14. Python实现键盘操作方法
  15. windows10安装Erlang和RabbitMQ
  16. MTK6577+Android之Camera驱动
  17. 基于开源软件打造企业网络安全
  18. Dell台式机安装ubuntu系统
  19. CentOS 6.5 安装使用iscsi-initiator
  20. linux无法识别耳机,Ubuntu 7.10中不能正常使用耳机的解决方法

热门文章

  1. [调试]Asp.Net常见问题
  2. java builder pool_每周10道Java面试题:String, String Pool, StringBuilder
  3. 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件...
  4. ssh WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
  5. php 获取cookieid,Redis实现Session共享详解
  6. java水印图片_JAVA实用案例之图片水印开发
  7. php 判断心跳包报错,第29问:MySQL 的复制心跳说它不想跳了
  8. python输入日期时间转换格式_python如何格式化日期?
  9. 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数
  10. linux 思维导图