BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #30260同步于 2014/5/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[问题]关于public static final类型变量

pf22099
2014/5/30镜像同步9 回复
请问一下public static final类型的变量在定义的时候是在哪里分配内存空间,似乎不是栈区也不是堆区?然后在下面的代码里我再两个类和一个接口里都定义了名字一模一样的三个public static final类型变量fff,为啥不会冲突呢?求大神解答,感谢感谢! class Father{ public static final int fff = 1; public void method(){ System.out.println("fff"); } } interface intf{ public static final int fff = 2; public void method(int aa); } class Child extends Father implements intf{ public static final int fff = 3; public void method(int aa) { } public static void main(String[] args){ System.out.println(Father.fff); System.out.println(intf.fff); } }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
taoch机器人#1 · 2014/5/30
这些是存储在运行时常量池的 运行时常量池中的内容在类加载后确定,所以还是和具体的类有关的,由不同的类来控制访问冲突。正如使用的时候,得用类名.fff来访问这个域 【 在 pf22099 (CyberLeon) 的大作中提到: 】 : 请问一下public static final类型的变量在定义的时候是在哪里分配内存空间,似乎不是栈区也不是堆区?然后在下面的代码里我再两个类和一个接口里都定义了名字一模一样的三个public static final类型变量fff,为啥不会冲突呢?求大神解答,感谢感谢! : class Father{ : public static final int fff = 1; : ...................
pf22099机器人#2 · 2014/5/30
Soga!这么说来static类型的变量是通过类名来进行标识的,这样就解释通了,多谢指点! 【 在 taoch 的大作中提到: 】 : 这些是存储在运行时常量池的 : 运行时常量池中的内容在类加载后确定,所以还是和具体的类有关的,由不同的类来控制访问冲突。正如使用的时候,得用类名.fff来访问这个域
shan10211865机器人#3 · 2014/5/30
static类型的变量直接通过类名访问即可,如一些工具类,math方法,这些工具不需要new对象,在类加载的时候已经加载到内存里通过 类名.方法名 来使用
modispy机器人#4 · 2014/5/30
我也来回复下; jvm加载class文件的时候,会把各个类的一些信息其中就包括static的变量,提取存放在方法区,每个class文件都会有相应的关于该类的属性存储表(包括该类的静态变量,实例化该类的时候该分配多大的内存空间等信息),而在堆中实例化对象的时候,堆中其实有指向当前对象所属类和其父类在方法区属性存储表。这样就可以直接通过类名直接访问,并且interface和那个父class属性表是在方法区中2个不同的空间,所以不会冲突
dss886机器人#5 · 2014/5/30
学习 【 在 modispy (魔笛) 的大作中提到: 】 : 我也来回复下; : jvm加载class文件的时候,会把各个类的一些信息其中就包括static的变量,提取存放在方法区,每个class文件都会有相应的关于该类的属性存储表(包括该类的静态变量,实例化该类的时候该分配多大的内存空间等信息),而在堆中实例化对象的时候,堆中其实有指向当前对象所�
pf22099机器人#6 · 2014/5/30
嗯,多谢!这么说在加载class的时候static型变量就已经被分配好内存了对吧,而不是在实例化类对象的时候进行分配? 【 在 modispy 的大作中提到: 】 : 我也来回复下; : jvm加载class文件的时候,会把各个类的一些信息其中就包括static的变量,提取存放在方法区,每个class文件都会有相应的关于该类的属性存储表(包括该类的静态变量,实例化该类的时候该分配多大的内存空间等信息),而在堆中实例化对象的时候,堆中其实有指向当前对象所属类和其父类在方法区属性存储表。这样就可以直接通过类名直接访问,并且interface和那个父class属性表是在方法区中2个不同的空间,所以不会冲突
modispy机器人#7 · 2014/5/31
是的~~ 【 在 pf22099 的大作中提到: 】 : 嗯,多谢!这么说在加载class的时候static型变量就已经被分配好内存了对吧,而不是在实例化类对象的时候进行分配? :
pf22099机器人#8 · 2014/5/31
明白,多谢大神指点!~ 【 在 modispy 的大作中提到: 】 : 是的~~ :
tiantiando机器人#9 · 2014/12/31
【 在 taoch 的大作中提到: 】 : 这些是存储在运行时常量池的 : 运行时常量池中的内容在类加载后确定,所以还是和具体的类有关的,由不同的类来控制访问冲突。正如使用的时候,得用类名.fff来访问这个域 public static final 应该是在方法区