为什么Java是静态语言?

为什么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异常

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值