宝强理解Java的非虚方法
1.什么是非虚方法
定义: 在类加载的时候会把符号引用解析为该方法直接引用的方法称为非虚方法;
我是导演,我有一部春工大闹要拍, 这个戏的主角(类)我想请宝强
2. 理解一下,类加载(把宝强请到剧组)
==== 类的生命周期begin=====
【1.加载 --- 请宝强剧组报到 - 不管你宝强从哪里来】
典型的 从*.java --编译-> *.class ----加载--> 到内存对象(字节流)
--- 虚拟机二进制流没有规定必须从Class文件获取, 只要符合类文件格式 ,从war,jar,网络中,数据库中,计算生成,jsp生成都可以
【2.验证 -- 验明真身】检查这个字节流是不是符合要求
【3.准备 -- 定好造型,书生就戴眼镜,海盗就戳一只眼】类变量初始值阶段
【4.解析 -- 道具准备好,人员确定好的都登记好】将常量池内的符号引用替换为直接引用的过程
【5.初始化 --- 根据各场景,具体确定演员,戏份】 实例化类 , 比如 new 类构造器
【6.使用 --- 开演】 各种装B
【7.卸载 --- 结束拍摄】 垃圾回收 狗带
======生命周期end=============
3. 那什么是符号引用与直接引用呢
宝强来到剧组,一看有一场对手戏, 就问导演,对戏的是哪个
导演说, 是马大容, 宝强 对戏马大容(内存里就是对象的指针) 就是直接引用 ;
要是导演说, 刚到剧组没确定,要到定好场景时才能知道
宝强只能记对戏女主#1 , 这样就符号引用,宝强的心里#1就是一个符号
同理, 加载时, class文件里不能确定的, 给他个符号 比如#1 ,表示某个方法
要是能确定的直接调用指针
符号引用的好处就是 根据不同的场景替换不同的女主, 不必一开始就定死,灵活
4. 到底哪些是非虚方法
java语言符合 "编译期可知,运行期不可变" 这个要求的方法
例如 :
1. 静态方法
2. 私有方法
3. 实例构造器
4. 父类方法
5. final方法