java-动态绑定-调用方法的过程

先上代码

package com.ray.testobject;

/**
 * 调用方法的过程
 *
 * @author ray
 * @since 2015-05-01
 *
 */
public class Person {
	public void say() {
		System.out.println("i am a person");
	}

	public void say(int age) {
		System.out.println("i am " + age);
	}

	public void say(String name) {
		System.out.println("my name is " + name);
	}

	public static void main(String[] args) {
		Person person = new Person();
		person.say("jack");
	}
}

输出:

my name is jack

过程如下:

1.先找到person这个对象变量所对应的变量,也就是找到了Person这个类实例出来的对象

2.再在Person这个类所生成的对象里面,查找想要的方法签名

方法签名=方法名称+参数类型

注意:这里没有涉及返回类型

3.对于调用person.say(”jack“)来说,编译器先会挑选say(String),而不是say(int)或者say()

由于java里面允许类型转换,所以如果找不到,他会相应的往他的父类去找,如果没有找到,则返回异常

其实这里面的查找过程非常复杂,而且开销很大,所以jvm会编制一张方法表(method table),然后jvm

直接找这个表即可

4.找到想要的方法,调用即可

时间: 2024-10-18 12:00:59

java-动态绑定-调用方法的过程的相关文章

java反射调用方法

1:Class类中的方法 public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException 参数: name - 方法名 parameterTypes - 参数数组 返回: 该类与指定名和参数相匹配的方法的 Method 对象 2:Method类中的方法; public Object invoke(Object obj,

简述下Objective-C中调用方法的过程(runtime)

Objective-C是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector),整个过程介绍如下: objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类 然后在该类中的方法列表以及其父类方法列表中寻找方法运行 如果,在最顶层的父类(一般也就NSObject)中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX 但是在这之前,ob

Java调用方法参数究竟是传值还是传址?

之前阅读<Head First Java>的时候,记得里面有提到过,Java在调用方法,传递参数的时候,采用的是pass-by-copy的方法,传递一份内容的拷贝,即传值.举一个最简单的例子: 1 public class Test { 2 public static void main(String[] args) { 3 int numberA = 1; 4 int numberB = 2; 5 swap(numberA, numberB); 6 System.out.println(nu

Java——动态绑定和多态

动态绑定是在执行期间(而不是编译期间)判断所用对象的实际类型,根据其实际的类型调用其相应的方法(确定选择哪个多态形式被调用). 首先是方法的参数是父类对象,传入子类对象是否可行 然后引出Parent p = new Children(); 这句代码不是很理解,google的过程中引出向上转型 要理解向上转型又引出了动态绑定 从动态绑定又引出了静态绑定   程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后

Java基础 之Java动态绑定详解

程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定 静态绑定(早绑定 编译器绑定): 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C. 针对java简单的可以理解为程序编译期的绑定:这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定(迟绑定 运行期绑定): 后期绑定:在运行时根据具体对象的类型进行绑定. 若一种语言实现

Java 动态绑定 静态绑定

绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定,或者叫做前期绑定和后期绑定. 静态绑定: 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现. 针对java简单的可以理解为程序编译期的绑定,这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定: 在运行时根据具体对象的类型进行绑定. 若一种语言实现了动态绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分

Java 类加载、调用构造器、执行方法的过程

注:整理到这部分知识点时候发现有很多问题还没搞清楚,所以这里可能会存在很多不够详细甚至错误的理解,准备翻一遍编程思想再来更新, 欢迎评论交流 当JVM执行到这么一句代码:  new Person().setName("superzhao") 它会做这么几件事 类加载 JVM会用类加载器加载xxx.Person这个class文件 加载(class){ if(class有父类){ 加载(superclass); } 1.静态域申明,默认初始化为0,false,null 2.按照申明顺序(从

java反射机制之Method invoke执行调用方法例子

昨天在群里跟大家讨论了下java反射调用可变参数的问题,这个问题起因是我们需要反射调用另一个部门提供的方法,我同事说java不能反射调用可变参数的方法,于是我写了个demo证明了他这个观点的错误.但是测试过程中,有一点我不明白,就是反射调用可变参数的方法时,为什么一定要保证传入的参数数组长度为1,在群里跟大家讨论了很多,没有得到确切的答案,参照网上大牛写的东西和我自己跟源码的过程,记录如下: 1.两个类,一个父类,一个子类 [java] view plain copy print? packag

Java通过JNI调用dll详细过程(转)

源:Java通过JNI调用dll详细过程 最近项目有这样一个需求,在已有的CS软件中添加一个链接,将当前登录用户的用户名加密后放在url地址中,在BS的login方法里通过解密判断,如果为合法用户则无需再次登录直接进入平台,CS软件方提供了一个加密解密的dll文件,我们需要在action中通过该dll解密,那么就涉及到java调用dll的问题. 首先我选择了JNI方式(因为网上说的另两种方式Jawin, Jacob更不会),大体流程如下: 1.写一个java的class,在类里声明所调用的库名称