Java基础系列(十四):方法调用
时间:2022-06-17
本文章向大家介绍Java基础系列(十四):方法调用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
方法签名
方法的签名包括两部分,方法名和参数列表。
如果在子类中定义了一个与父类签名相同的方法,那么子类中的这个方法就会覆盖父类中这个相同签名的方法。这里需要注意一点,在覆盖一个方法的时候,子类方法不能低于父类方法的可见性,比如一个同样方法签名的方法在父类中的修饰符是 public
,而在子类中是 private
。
但是需要注意的是,返回类型并不是方法签名的一部分,所以,在覆盖方法的时候,一定要保证返回类型的兼容性,允许子类将覆盖方法的返回类型定义为原返回类型的子类型。
方法调用流程
假设,这里有一个类A,其中有方法f,当这个类A创建一个实例a并调用f时, a.f(args)
时有一些细节需要注意:
- 首先,编译器查看对象的声明类型和方法名。这里需要注意一点,有可能存在多个名 字为f,但是参数类型不一样的方法。例如,可能存在方法
f(int)
和方法f(String)
。编译器将会一一列举所有C类中名为f的方法和其父类中访问属性为public
且名为f的方法(需要注意的是,父类的私有方法不可访问)。 - 第二步,编译器将会查看调用方法时提供的参数类型。如果在所有名为f的方法中存在一个与提供的参数类型完全匹配,就会选择这个方法。这个过程被称为重载解析。例如,对于调用
a.f("Hello")
来说,编译器将会挑选f(String)
,而不是f(int)
。如果编译器没有找到与参数类型匹配的方法,或者发现经过类型转换后有多个方法与之匹配,编译器就会报错。 - 如果是
private
方法,static
方法,final
方法或者构造器,那么编译器将可以准确的知道调用哪个方法,我们将在这种方式称为静态绑定,而与之对应的是之前我们提过的调用的方法依赖于隐式参数的实际类型,并且在运行的时候实现动态绑定。 - 每次调用方法都要进行搜索,时间和资源的开销相当大。所以,虚拟机预先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法。这样一来,在真正调用方法的时候,虚拟机仅仅去查找这个表就可以了。
方法解析流程
- 虚拟机提取对象变量所对应类的方法表,该方法表在编译过程中产生。
- 虚拟机会搜索定义调用该方法签名的类,这时,虚拟机已经知道该调用哪个方法。
- 虚拟机调用并方法。
下节预告
final关键字
- 【深度学习系列】用PaddlePaddle进行车牌识别(一)
- GO语言-new()分配与构造和初始化结构
- Java基础-day05-超市收银系统案例题
- mongodb11天之屠龙宝刀(五)lbs地理位置检索:存储经纬度以及查询
- 【深度学习系列】关于PaddlePaddle的一些避“坑”技巧
- 【深度学习系列】PaddlePaddle可视化之VisualDL
- Java基础-day04-代码题
- 【深度学习系列】CNN模型的可视化
- mongodb11天之屠龙宝刀(六)mapreduce:mongodb中mapreduce原理与操作案例
- 真实场景的虚拟视点合成(View Synthsis)详解
- mongodb11天之屠龙宝刀(七)functions: mongodb 执行 functions入门案例
- 真实场景的双目立体匹配(Stereo Matching)获取深度图详解
- mongodb11天之屠龙宝刀(八)聚合函数与管道:sql与mongodb聚合函数对比
- Java基础-day04-基础题
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 「Python 正则」使用专题总结
- 如何真正理解好一个「设计模式」?
- 10 行实现最短路算法
- 深度学习Pytorch检测实战 - Notes - 第6章 单阶经典检测器:YOLO
- 从图片裁剪来聊聊前端二进制
- 【投稿】刀哥:Rust学习笔记 2
- 【每周一库】- JWT的Rust实现
- 【Rust日报】2020-08-15 Rust Nightly 标准库文档已涵盖了每个关键字
- 【Rust日报】2020-08-16 Cranelift现在可以编译rustc,比LLVM的编译速度快7倍!
- 【Rust日报】2020-08-17 浏览器之外的 WebAssembly
- 前沿技术探讨:Rust语言真的安全吗?
- Java、Go和Rust间的比较
- 【文末送书】非常实用的 Python 技巧
- 消息队列:Rabbitmq如何保证不丢消息
- 二叉树:删除节点