JVM杂记:对多态实现原理、虚方法表、虚方法、静态解析、动态链接的一些思考

文章目录0.前言1.前置知识1.1 虚方法和非虚方法1.2 符号引用和直接引用0.前言最近在学JVM,但学的很痛苦,因为JVM的知识点都不连贯,而且也没找到什么资料,也很难进行验证。如标题,在学习的过程中遇到了这些概念,刚开始很难理解,后来不停找资料、看视频、看书,算是得出了一些个人总结,不一定完全准确,希望对大家有个借鉴。下面的讲解,需要大家提前对JVM有一部分了解,比如类加载、JVM内存模型等、字节码文件等知识,会按照源代码,然后编译成字节码文件,然后字节码文件被加载进虚拟机内存的顺序讲起。1
摘要由CSDN通过智能技术生成

0.前言

最近在学JVM,但学的很痛苦,因为JVM的知识点都不连贯,而且也没找到什么资料,也很难进行验证。如标题,在学习的过程中遇到了这些概念,刚开始很难理解,后来不停找资料、看视频、看书,算是得出了一些个人总结,不一定完全准确,希望对大家有个借鉴。

下面的讲解,需要大家提前对JVM有一部分了解,比如类加载、JVM内存模型等、字节码文件等知识,会按照源代码,然后编译成字节码文件,然后字节码文件被加载进虚拟机内存的顺序讲起。


1.正文

1.1 虚方法和非虚方法

先来看广义上的定义(即指Java代码层面):

  • 非虚方法:如果方法在编译期就确定了具体的调用版本,这个版本在运行时是不可变的。这样的方法称为非虚方法。

    静态方法、私有方法、final方法、实例构造器、父类方法都是非虚方法

  • 虚方法:其他方法就叫做非虚方法

咦?怎么理解上面的这两个定义呢?大家来抓一下重点,编译期就确定了具体的调用版本,这个是虚方法和非虚方法的本质区别,方法在编译期确定?这个是什么意思,难道方法还能不确定的?

下面来看个具体的代码例子:

class Animal{
   
    void test(){
   
        System.out.println("动物");
    }
}

class Cat extends Animal{
   
    @Override
    void test(){
   
        System.out.println("猫");
    }
}

class Test {
   
    void test(Animal animal){
   
    	// 此时方法就是无法确定的
        animal.test();
    }
}

Test类里的test方法里面的这句代码animal.test();就是无法确认的,只有在运行的时候根据实际参数,才知道调用的Animal还是Cat这下子明白方法的编译期就确定了具体的调用版本是什么意思了吧。

你也可以这么理解,不可能被重写的方法就叫做非虚方法,比如静态方法、final定义的方法、私有方法等;有可能被重写的方法就叫做虚方法,注意噢,只要是有可能重写的都是虚方法,尽管你还没重写。

再来看进一步的定义,这一个大家了解一下就好:

    • 7
      点赞
    • 23
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值