虚拟机栈
- 根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。
![](/2020/11/14/%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A0%88/1.png)
由此先来看看虚拟机栈的作用。
虚方法和非虚方法
非虚方法:方法在编译器就确定了具体的调用版本,这个版本的运行时是不可变的(非虚方法有静态方法、私有方法、final方法、实例构造器、父类方法,其他方法为虚方法)。
jvm提供了以下几条方法调用指令:
- 调用非虚方法(final修饰的方法除外):
- (1)invokestatic:调用静态方法,解析阶段确定唯一方法版本。
- (2)invokespecial:调用
方法、私有方法、父类方法,解析阶段确定唯一方法版本。
- 调用虚方法:
- (3)invokevirtual:调用所有虚方法。(调用final方法用的是这个指令)
- (4)invokeinterface:调用接口方法。
- (5)invokedynamic:动态解析出需要调用的方法,然后执行。
- 调用非虚方法(final修饰的方法除外):
程序计数器
- 根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。
![](/2020/11/14/%E7%A8%8B%E5%BA%8F%E8%AE%A1%E6%95%B0%E5%99%A8/1.png)
由此先来看看程序计数器的作用。
类加载
Java常用类
1、String类
- String声明为final的,不可被继承。
- String实现了Serializable接口:表示字符串是支持序列化的;实现了Comparable接口:表示String可以比较大小。
- String内部定义了final char[] value用于存储字符串数据。
- String:代表不可变的字符序列。简称:不可变性。
- 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
- 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
- 字符串常量池中是不会存储相同内容的字符串的。