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定义的方法、私有方法等;有可能被重写的方法就叫做虚方法,注意噢,只要是有可能重写