为什么Java是静态语言?浅谈方法的调用
-
静态链接
当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期可知,且运行期保持不变时。这种情况下将调用方法的符号引用转换为直接引用的过程称为静态链接。对应方法的绑定机制为早期绑定。确定了调用方法的版本,运行期间不可变,称为非虚方法。(其他方法都成为虚方法)
静态方法、私有方法、final方法、实例构造器、父类方法都是非虚方法。
-
动态链接
如果被调用的方法在编译期无法被确定下来,也就是说只能在程序运行期将符号引用转为直接引用,由于这种转换过程具备动态性,因此也就被称之为动态链接。对应方法的绑定机制为晚期绑定。
举例:
如果定义一个类,其中有一个构造器内部是空构造器或者只调用父类构造器super()
那么这时编译期这个过程就是早期绑定,换句话说就是确定下来了。
如果定义一个animal类其中有吃饭、玩耍等抽象方法,cat和dog类继承animal类分别实现抽象方法。当有一个测试方法调用animail.eat()
时候不知道到底传进来的实参是cat还是dog对象,无法编译时判断如何对其定性,这时标识这个方法为晚期绑定。
那么对比不同语言方式
-
java代码:String s = “张三“;
-
JS代码:var m = ‘a’;
-
python代码:info = 133.5;
通过以上对比和上述就可以知道JS和Python都是动态语言,而java是静态语言。
Java语言中方法重写的本质:
1、在操作数栈中找到栈顶元素执行的对象的实际类型,记作C
2、如果在C中找到与常量中描述符合的方法,再进行权限校验,通过则将符号引用转为直接引用;不通过则返回java.lang.IllegalAccessError异常。
3、否则依照继承关系从上往下一次对C的父类进行第2步搜索和验证过程
4、如果没有找到合适的方法则抛出 java.lang.AbstractMethodError异常