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确定了函数实际类型时,按此表用以上步骤进行查找调用。
java 继承调用_【JAVA学习】继承中函数调用机制相关推荐
- mllib java怎么调用_如何准备mllib中的训练数据
ML LogisticRegression 尚不支持多项分类,但MLLib NaiveBayes 和 LogisticRegressionWithLBFGS 都支持它 . 在第一种情况下,它应该默认工 ...
- java 摄像头 win7_Win7系统下JAVA摄像头调用_实例代码介绍
Win7系统下JAVA摄像头调用_实例代码介绍.由于要搞个人脸识别登录(JAVACV),百度谷歌了一下午,找了网上简单的样例代码来试,可是老是调试不过,出现CaptureDeviceManager.g ...
- java 数据源调用_实战分享: Spring boot 调用之间实现动态数据源
需求: 根据项目部署在不同的域名,在同一套系统下,分别访问不同的数据库 (当然在看别人帖子的时候,也发现了不同接口访问不同数据源问题,就是分库动态数据源需求了,其实实现都一样) 业务描述: 部署的时候 ...
- java openresty 调用_玩转 OpenResty 协程 API
注意:本文中列出的所有代码只是 Proof Of Concept,基本上都没有进行错误处理.另外对于一些边际情况,也可能没有考虑清楚.所以对于直接复制文中代码到项目中所造成的一切后果,请自负责任. O ...
- java 内存跟踪_详解JVM中的本机内存跟踪
1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...
- proto文件支持继承吗_搞懂 Javascript中this 指向及继承原理
在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的new 到底是干什么的 一.什么是 JS 原型链? 我们知道 JS 有对象,比如 var obj ...
- java编程学习方法_在线学习Java编程的最佳方法
java编程学习方法 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好 ...
- java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息
Jstack 用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息. 这里需要注意的是 Java 8 引入了 Java Mission Control, ...
- java reduce 分组_使用JAVA8 stream中三个参数的reduce方法对List进行分组统计
背景 平时在编写前端代码时,习惯使用lodash来编写'野生'的JavaScript; lodash提供来一套完整的API对JS对象(Array,Object,Collection等)进行操作,这其中 ...
- java如何调用linux命令_java程序中如何调用linux命令
java程序中如何调用linux命令 作为一个Java开发人员,有些常用的Linux命令必须掌握.即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令.因为很多服 ...
最新文章
- html 图片剪裁控件,h5图像裁剪(基于canvas)插件Image-Clip
- 科学家利用脑机接口让患者正常发声
- ubuntu18.04换清华源
- 团队行为心理学读书笔记(8)绩效考核背后的行为心理学
- atoi(s)函数用法
- 启动另一个activity
- SQL Server的下载和安装
- AI上推荐 之 xDeepFM模型(显隐性高阶特征交互的组合策略)
- 能源消耗总量计算公式_七、能源统计(21)
- TAOCP-Reading-计算机程序设计艺术阅读-1-0
- 商业模式丶商业模式画布丶商业模式画布个人版
- Mugeda(木疙瘩)H5案例课—教学课件如何做-岑远科-专题视频课程
- java dvr_java – 如何设置与DVR的连接并解码数据?
- Python实现键盘操作方法
- windows10安装Erlang和RabbitMQ
- MTK6577+Android之Camera驱动
- 基于开源软件打造企业网络安全
- Dell台式机安装ubuntu系统
- CentOS 6.5 安装使用iscsi-initiator
- linux无法识别耳机,Ubuntu 7.10中不能正常使用耳机的解决方法
热门文章
- [调试]Asp.Net常见问题
- java builder pool_每周10道Java面试题:String, String Pool, StringBuilder
- 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件...
- ssh WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
- php 获取cookieid,Redis实现Session共享详解
- java水印图片_JAVA实用案例之图片水印开发
- php 判断心跳包报错,第29问:MySQL 的复制心跳说它不想跳了
- python输入日期时间转换格式_python如何格式化日期?
- 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数
- linux 思维导图