在Java JVM里,如果一个变量被声明为final或者static, 那么这个变量的引用以及它的值被存放在哪?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Java JVM里,如果一个变量被声明为final或者static, 那么这个变量的引用以及它的值被存放在哪?相关的知识,希望对你有一定的参考价值。
是在Heap,还是stack?还是method区? 下面是一个代码例子的一段:
public static main void(String args[])
final int a = 9;
static int b = 5;
有大侠能帮忙吗?在网站上找了很多帖子,都各有各的说法。
static修饰的变量被放在方法区,因为它属于类变量,是类的一部分。
所有的方法中的普通变量都是在栈中的局部变量表中的,如果是引用类型的变量局部变量表会存放引用对象的地址,这个引用对象实际存储在堆中。如果被final修饰的话代表这个引用类型的变量指向的地址无法被改变。所以final修饰的引用的地址和final修饰的基本数据类型都会放在常量池,常量池位于方法区中。 参考技术A static : 在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,static变量有点类似于c中的全局变量的概念
定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用
具体参考位置:http://www.west263.com/www/info/29091-1.htm 参考技术B 全局变量是在堆(Heap)里 ,局部变量在栈里,static 不允许放主函数里面. 参考技术C int a = 9;
这种变量在编译器就已经知道大小,长度了。所以应该不会放到堆中,都是直接放到栈里面的。本回答被提问者采纳 参考技术D int 是在heap区
Java中重点关键词的区分
1、final, finally, finalize的区别
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
因此一个类不能既被声明为 abstract的,又被声明为final的。
将变量或方法声明为final,可以保证它们在使用中不被改变。
被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。
被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供 finally 块来执行任何清除操作。
如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
它是在 Object 类中定义的,因此所有的类都继承了它。
子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。
finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
2、String 和StringBuffer 的区别?
String 对一串字符进行操作。不可变类。
StringBuffer 也是对一串字符进行操作,但是可变类。
String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");
字符串连接操作中StringBuffer的效率要比String高:
String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.
并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
以上是关于在Java JVM里,如果一个变量被声明为final或者static, 那么这个变量的引用以及它的值被存放在哪?的主要内容,如果未能解决你的问题,请参考以下文章