java 方法调用的过程

将一个方法的调用同方法主体连接到一起称为“绑定”。如果在程序运行前执行绑定,有编译器决定方法调用的程序,称为“早期绑定”或“静态绑定”。如果绑定过程在程序运行期间进行,以对象的类型为基础,则称为“后期绑定”或“动态绑定”。

如果一种语言实现了后期绑定,同时必须提供一些机制,可以在运行期间判断对象的实际类型,并分别调用适当的方法,即编译器此时仍然不知道对象的类型,但方法调用机制能够自己去调查,找到正确的方法体。Java方法的执行主要采用动态绑定技术,在程序运行时,虚拟机将调用对象实际类型所限定的方法。

Java方法调用过程主要经历了以下的过程:

(1)编译器查看对象变量的声明类型和方法名,通过声明类型找到方法列表。

例如,Parent p = new Child()对象的声明类型是Parent类对象,实际类型是Child类对象,找Parent类的方法表。如果在Child类定义了新的方法,而不是重载Parent类的方法,那么这个新方法对于p而言是不可见的,详见下面向上转型后,子类的特有方法将失效。

(2)编译器查看调用方法时提供的参数类型

(3)如果方法由private,static和final修饰或者是构造器,编译器就可以确定调用那一种方法,即采取静态绑定技术。如果不是上述情况,就采用动态绑定技术,执行后续过程。

(4)虚拟机提取对象变量的实际类型的方法。

例如下面的p.get()调用的是Child类中的get方法。

(5)虚拟机搜索方法签名

(6)调用方法

静态绑定
除了private,static和final修饰方法或者是构造器是静态绑定以外,对于成员变量而言,无论是实例变量还是静态变量,都执行的是静态绑定,即对成员变量的引用在编译时候就已经确定好了。所以p.name中的p类型是Parent类的对象。
向上转型后,子类的特有方法将失效。

class Parent {
String one, two;
public Parent(String a, String b) {
	one = a;
	two = b;	
	}
	public void print() {
	System.out.println(one);
	}
}
public class Child extends Parent {
public Child(String a, String b) {
	super(a, b);
	}
	public void print() {
		System.out.println(one + " to " + two);
	}
	public void ChildPrint(){System.out.println("这是子类里面都有的方法");}
	public static void main(String arg[]) {
		Parent p = new Parent("south", "north");
        p.print();
		Parent t = new Child("east", "west");
		t.print();
		//t.ChildPrint();
	}
}
注意:t.ChildPrint()将会出现编译错误。根据上面的方法调用过程步骤(1)我们可以知道答案。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值