弄清楚方法的调用过程,对于我们学习java极为重要,下面是调用过程的详细描述:
1、编译器查看对象的声明类型和方法名。
编译器去寻找所有名字为f但参数类型不同的方法。例如可能存在方法f(int)和方法f(String),编译器会一
一列出所有当前类中所有名为f的方法,和其超类中访问属性为public且名为f的方法(超类中的私有方法不可访问)
2、编译器将查看调用方法是提供方的参数类型。
如果在所有名为f的方法中,有与所提供的参数完全匹配的方法,则选择这个方法,这个过程称为“重载匹配”。例如对于调用f("Hello"),编译器就会选择并调用f(String)方法,而不会调用f(int)。另外由于允许类型转换(例如int可以转换为double),因此如果编译器没有找到与参数类型匹配的方法,或者找到类型转换后有多个方法与之匹配,就会报错。
(注:这里的类型转换以不丢失精度为标准)
3、
如果是private、static、final方法或者构造器,编译器会准确的知道应该调用那个方法,这种调用方式成为静态绑定,与此对应的是,调用方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。
4、当程序运行时,并且采用动态绑定的调用方法时,虚拟机一定会调用与x所引用的对象的实际类型最合适的那个类的方法
。例如,假设x的实际类型时D,它是C的子类。如果D类定义了方法f(String),则直接调用它,否则去D的超类中去寻找方法。
举个实际例子:
OB解说一波,e.getSalary()方法的解析过程
1、虚拟机提取e实际类型的的方法表
2、虚拟机搜索定义getSalary的签名的类
3、调用方法
解说完成!!!!
热门工具 换一换