static java 内存_final, static,final static 分别放在jvm内存的什么地方?

比如我写一个类:public class JvmTest {

public static String st_static = "hello static";

public final String st_final = "hello final";

public static final String st_final_str = "hello final static";

public static void main(String[] args) throws IOException {

JvmTest jvmTest=new JvmTest();

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

while (true) {

String str=br.readLine();

if (str.length() == 0) {

if (jvmTest.st_final==str){

System.out.println("1");

}

if (jvmTest.st_static==str){

System.out.println("2");

}

if (jvmTest.st_final_str==str){

System.out.println("3");

}

break;

}

}

}

}

那么st_static,st_final,st_final_str分别放在什么区?找到了这么一段话:

运行时常量池:

在方法区中,每个类型都对应一个常量池,存放该类型所用到的所有常量,常量池中存储了诸如文字字符串、final变量值、类名和方法名常量。它们以数组形式通过索引被访问,是外部调用与类联系及类型对象化的桥梁。(存的可能是个普通的字符串,然后经过常量池解析,则变成指向某个类的引用)

字段信息:

字段信息存放类中声明的每一个字段的信息,包括字段的名、类型、修饰符。

字段名称指的是类或接口的实例变量或类变量,字段的描述符是一个指示字段的类型的字符串,如private A a=null;则a为字段名,A为描述符,private为修饰符

方法信息:

类中声明的每一个方法的信息,包括方法名、返回值类型、参数类型、修饰符、异常、方法的字节码。

(在编译的时候,就已经将方法的局部变量、操作数栈大小等确定并存放在字节码中,在装载的时候,随着类一起装入方法区。)

静态变量:

类变量,类的所有实例都共享,在方法区有个静态区,静态区专门存放静态变量和静态块。

到类classloader的引用:到该类的类装载器的引用。

到类class的引用:虚拟机为每一个被装载的类型创建一个class实例,用来代表这个被装载的类。

由此可以知道反射的基础:

在装载类的时候,加入方法区中的所有信息,最后都会形成Class类的实例,代表这个被装载的类。方法区中的所有的信息,都是可以通过这个Class类对象反射得到。我们知道对象是类的实例,类是相同结构的对象的一种抽象。同类的各个对象之间,其实是拥有相同的结构(属性),拥有相同的功能(方法),各个对象的区别只在于属性值的不同。

同样的,我们所有的类,其实都是Class类的实例,他们都拥有相同的结构-----Field数组、Method数组。而各个类中的属性都是Field属性的一个具体属性值,方法都是Method属性的一个具体属性值。

在运行时,JVM从常量池中获得符号引用,然后在运行时解析成引用项的实际地址,最后通过常量池中的全限定名、方法和字段描述符,把当前类或接口中的代码与其它类或接口中>的代码联系起来

这段文字表示,方法区有”常量池“,”静态区“两个特殊对待的地方,那么static string又是什么区呢,这个笔者查了很多地方,其实一个网络就那么几篇文章,都是一样的,所以说啊百度太垃圾了,大量的文章其实都是雷同的。我个人认为还是在静态区中,这里就没有对字符创特殊处理了。我们假设放在常量池里,那么你知道常量池有许多对String特殊处理的特点,比如又在线程栈里引用了已经存在的字符串,那岂不是引用的是静态区?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值