这样定义一个常量占内存吗。
这样定义有什么优点??
直接用final不可以。。?
主要说说内存占用问题。。 谢谢
这样定义有什么优点??
直接用final不可以。。?
主要说说内存占用问题。。 谢谢
解决方案 »
- javaw.exe线程数不下降
- 求一条统计用的sql
- jsp的怪问题
- jsp页面里如何用通用的方法判断session被invalidate了或expire了
- Web project部署上以后,所有自定义标签都没有生效,而且导致整个页面显示为空
- JSP!!!!!
- 急问:JDBC同时连接SQL Server 7 和 SQL Server 8,如何设置驱动?
- 高高分!!!!送。。来者有分!!!!
- 出现 Object has been closed 错误信息是怎么回事?
- 用jspsmartupload上传文件到数据库?
- FreeMarker搞了半天都没有成功生成静态页面
- web文件下载时文件名过长导致截断(字符编码问题:UTF-8,ISO8859-1)
使用 int b = a*4;
编译 java编译器将把所有使用这个常量的地方用3代替(即:int b=3*4, 当然是字节码形式啦),
public static final int a = 3;这句话就不需要啦,不会编译进去啦,当然运行的时候也谈不上占用内存啦
那public static final int a = 3;不放在常量池中吗。?
程序不结束能释放掉吗
测试:public class Main {
public static final int a = 3;
public static void main(String []args){
int b = a*4;
System.out.println(b);
System.out.println(a);
}
}编译后:Compiled from "Main.java"
public class Main extends java.lang.Object
SourceFile: "Main.java"
minor version: 0
major version: 49
Constant pool://常量池
const #1 = Method #5.#18; // java/lang/Object."<init>":()V
const #2 = Field #19.#20; // java/lang/System.out:Ljava/io/PrintStream;
const #3 = Method #21.#22; // java/io/PrintStream.println:(I)V
const #4 = class #23; // Main
const #5 = class #24; // java/lang/Object
const #6 = Asciz a;
const #7 = Asciz I;
const #8 = Asciz ConstantValue;
const #9 = int 3; //常量3
const #10 = Asciz <init>;
const #11 = Asciz ()V;
const #12 = Asciz Code;
const #13 = Asciz LineNumberTable;
const #14 = Asciz main;
const #15 = Asciz ([Ljava/lang/String;)V;
const #16 = Asciz SourceFile;
const #17 = Asciz Main.java;
const #18 = NameAndType #10:#11;// "<init>":()V
const #19 = class #25; // java/lang/System
const #20 = NameAndType #26:#27;// out:Ljava/io/PrintStream;
const #21 = class #28; // java/io/PrintStream
const #22 = NameAndType #29:#30;// println:(I)V
const #23 = Asciz Main;
const #24 = Asciz java/lang/Object;
const #25 = Asciz java/lang/System;
const #26 = Asciz out;
const #27 = Asciz Ljava/io/PrintStream;;
const #28 = Asciz java/io/PrintStream;
const #29 = Asciz println;
const #30 = Asciz (I)V;{
public static final int a;
Constant value: int 3 //这里的说明
public Main();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: bipush 12 //编译的时候就把3*4=12计算出来了,生成的代码里直接用12
2: istore_1
3: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
6: iload_1 //访问局部变量b
7: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
10: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
13: iconst_3 //对a的访问直接变成常数3,可以和上面对局部变量b的访问对比
14: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
17: return
LineNumberTable:
line 4: 0
line 5: 3
line 6: 10
line 7: 17}
public static final int a = 3;这句话就不需要啦,不会编译进去啦,当然运行的时候也谈不上占用内存啦 运行时不占内存那么public static final int a = 3;放到常量池中就不占内存了吗。。?
只是编译的时候就执行public static final int a = 3;属于编译期常量吧
运行时候就不会在调用public static final int a = 3;了吧 。。
比如public class Test3{
public static void main(String[] args){
System.out.println(Main.a);
}
}这里用到了Main中的static final的,编译的时候就直接替换掉了.而且主要通过编译,这个class文件中就不保存任何关于Main类的信息了,这个角度看应该是省内存的吧.
之间编译为System.out.println(3);了.编译之后就完全和Main这个类没有关系了.
加载的时候也不会把Main.class加载了.
那就明白了 非常感谢啊
以后要跟着ZangXT多学习了