Java对象方法的调用执行过程详解
目录
- 对象方法的调用执行过程
- 调用方法的几种方式
- 第一种
- 第二种
- 第三种
对象方法的调用执行过程
编译器查看对象的声明类型和方法名。假设调用x.f(param),隐式参数为x声明为C类对象,需要注意的是,有可能存在多个方法名为f,但是参数不同的方法,此时,编译器会一一列举C类中的所有方法名为f的方法和超类中访问属性为public的并且名字为f的方法。
接下来,编译器将查看调用方法时提供的参数类型。如果在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法,这个过程叫做“重载解析”。
如果是private方法、static方法、final方法或者是构造器,那么编译器就可以准确的知道应该调用那个方法,我们将这种调用方式为静态绑定,与此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。比如,调用一个f(String)的方法。
当程序运行时,并且采用动态绑定调用方法,虚拟机一定调用与x所引用对象的类型最合适的那个类的方法。假设,x的实际类型是D,他是C的子类,如果子类D中定义了f(String)方法,就直接调用它,否则就搜索C类中的方法,一次类推。
这样调用方法的开销十分的大,因此虚拟机为每个类都定义了一个方法表,其中列举了所有的方法名和签名,这样,真正调用方法时,虚拟机就直接朝朝这个表就可以了。
调用方法的几种方式
一般的,在Java语言中,调用方法有三种方式。
第一种
通过对象名.方法名进行调用,这是最普通的也是最常见的一种调用方式。
第二种
通过new关键字调用构造方法,这种是在实例化对象时使用的方式。
第三种
通过类名.方法名调用,当需要调用的那个方法为静态(有static的)方法时使用。配合实际操作,附如下例子:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
Java程序执行过程及内存机制详解
本讲将介绍Java代码是如何一步步运行起来的,其中涉及的编译器,类加载器,字节码校验器,解释器和JIT编译器在整个过程中是发挥着怎样的作用.此外还会介绍Java程序所占用的内存是被如何管理的:堆.栈和方法区都各自负责存储哪些内容.最后用一小块代码示例来帮助理解Java程序运行时内存的变化. Java程序执行过程 步骤 1: 写源代码,源代码将以.java的文件格式保存在电脑硬盘中. 步骤 2: 编译器(compiler)检查是否存在编译期错误(例如缺少分号,关键字拼写错误等).若通过检测,编译器
-
Java中类加载过程全面解析
类文件加载的顺序 1.先加载执行父类的静态变量及静态初始化块(执行先后顺序按排列的先后顺序) 2.再加载执行本类的静态变量及静态初始化块 只要类没有被销毁,静态变量及静态初始化块只会执行1次,后续再对该类进行其他操作也不会再执行这两个步骤. 类实例创建过程 只有在调用new方法时才会创建类的实例 1.按照上面类文件加载的顺序(类已被加载则跳过此步) 2.父类的非静态变量及非静态初始化块 3.父类的构造方法 4.本类的非静态变量及非静态初始化块 5.本类的构造方法 4.类实例销毁时候,首先销毁子类
-
Java的反射机制---动态调用对象的简单方法
唉!我还真是在面试中学习新东东啊,一个公司刚刚给了个测试,不过我很奇怪的是为什么web developer的职位居然考java的反射机制题,不过学习研究一下反射机制对我来说是件好事啦! 先说说什么是java反射机制吧,在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这 种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.主要功能:在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对 象:在运行时判断任意一个
-
java通过反射创建对象并调用方法
这篇文章主要介绍了java通过反射创建对象并调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotation.SetTable; public class UserEntity { private String userName; private int userAge;
-
Java对象方法的调用执行过程详解
目录 对象方法的调用执行过程 调用方法的几种方式 第一种 第二种 第三种 对象方法的调用执行过程 编译器查看对象的声明类型和方法名.假设调用x.f(param),隐式参数为x声明为C类对象,需要注意的是,有可能存在多个方法名为f,但是参数不同的方法,此时,编译器会一一列举C类中的所有方法名为f的方法和超类中访问属性为public的并且名字为f的方法. 接下来,编译器将查看调用方法时提供的参数类型.如果在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法,这个过程叫做“重载解析”.
-
Java实现将PPT转为OFD过程详解
本文以Java后端程序代码展示如何实现将PPT幻灯片转成OFD格式.下面是具体步骤. 步骤1:安装PPT库Spire.Presentation for Java 方法一.通过Maven仓库安装.在pom.xml文件中配置如下内容: <repositories> <repository> <id>com.e-iceblue</id> <url>https://repo.e-iceblue.cn/repository/maven-public/<
-
Python字节码与程序执行过程详解
目录 问题: 1. 执行过程 2. 字节码 3. 源码编译 三种编译模式: 4. PyCodeObject 5. 反编译 6. pyc 问题: 我们每天都要编写一些Python程序,或者用来处理一些文本,或者是做一些系统管理工作.程序写好后,只需要敲下python命令,便可将程序启动起来并开始执行: $ python some-program.py 那么,一个文本形式的.py文件,是如何一步步转换为能够被CPU执行的机器指令的呢?此外,程序执行过程中可能会有.pyc文件生成,这些文件又有什么作用
-
java通过Jsoup爬取网页过程详解
这篇文章主要介绍了java通过Jsoup爬取网页过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一,导入依赖 <!--java爬虫--> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.3</version> </depe
-
java property配置文件管理工具框架过程详解
这篇文章主要介绍了java property配置文件管理工具框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 property property 是 java 实现的 property 框架. 特点 优雅地进行属性文件的读取和更新 写入属性文件后属性不乱序 灵活定义编码信息 使用 OO 的方式操作 property 文件 支持多级对象引用 快速开始 环境依赖 Maven 3.x Jdk 1.7+ Maven 引入依赖 <depende
-
Java实现动物换位游戏完整 过程详解
目录 效果展示 一.效果展示 1.游戏界面 2.测试界面 二.项目介绍 1.总体需求 2.总体设计 三.代码展示 1.图形界面设计(gui包) 2.用户操作设计(data包) ① Animal类 ② LeftAnimal类 ③ RightAnimal类 ④ Point类 ⑤ ViewForAnimal类 3.游戏视图设计(view包) ① AnmialView类 ② GamePanel类 ③ HandleAnimalMove类 ④ HandleRedo类 ⑤ HandleReStart类 四.代
-
mysql update语句的执行过程详解
以前有过一篇关于MySQL查询语句的执行过程,这里总结一下update语句的执行过程.由于update涉及到数据的修改,所以,很容易推断,update语句比select语句会更复杂一些. 1,准备 创建一张test表 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) NOT NULL DEFAULT '0' COMMENT '数值', PRIMARY KEY (`id`) ) ENGINE=InnoDB
-
java中构造器内部调用构造器实例详解
可能为一个类写了多个构造器,有时可能想在一个构造器里面调用另外一个构造器,为了减少代码的重复,可用this关键字做到这一点. public class Flower { private String string; private int age; public Flower() { // 先调用public Flower(String string, int age) this("leon", 120); // 先调用public Flower(String string, int
-
JavaScript预编译和执行过程详解
javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行预编译>执行),了解javascript引擎的执行机理,将有助于在写js代码过程中的思路总结. 首先javascript是解释型语言,自然就是编译一行,执行一行. js运行过程分为三步:1.语法分析 2.预编译
-
c#源码的执行过程详解
要讲到C#源码的执行过程 首先要提下程序集,因为Clr并不是和托管摸块打交道的,而是和程序集(dll,exe) 1.从哪里来 程序集是由一个或者多个托管模块以及 资源文件等共同组成的,C#编译器(csc.exe)再把源码编程成IL代码和元数据的时候,会进一步连同资源文件合并成程序集, 实际上就是个PE32文件,里面包含一个清单文件 和多个托管模块和资源(如图),另外程序集中还有一些自描述信息. 2.执行过程 编译器生成好程序集以后,如果是可执行的程序集,会在Main方法执行之前,window会预
随机推荐
- js 通过cookie实现刷新不变化树形菜单
- JS利用正则表达式实现简单的密码强弱判断实例
- C++实现四叉树效果(附源码下载)
- Android studio实现刮刮乐的方法
- js confirm()方法的使用方法实例
- 在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法
- 域名和cookie问题(域名后缀)
- php使用parse_str实现查询字符串解析到变量中的方法
- Nodejs极简入门教程(一):模块机制
- linux下tomcat常用操作
- Ajax实现无刷新分页实例代码
- 我的javascript 函数链之演变
- Java实现DES加密与解密,md5加密以及Java实现MD5加密解密类
- php中 $$str 中 "$$" 的详解
- Shiro集成Spring之注解示例详解
- 使用Python计算玩彩票赢钱概率
- 给debian的docker容器添加crontab定时任务
- Python Dataframe 指定多列去重、求差集的方法
- iOS开发之导航栏各种右滑返回失效的解决方法汇总
- Docker Compose 网络设置详解