这样定义一个常量占内存吗。
这样定义有什么优点??
直接用final不可以。。?
主要说说内存占用问题。。 谢谢

解决方案 »

  1.   

    static final 的意思是程序启动就创建而且一直存在不会销毁。
      

  2.   

    这是定义一个静态常量,通常将一些固定不会变的值定义为这种 static final ,主要是为提高性能。
      

  3.   

    static final 应该来说不占内存定义 public static final int a = 3;
    使用 int b = a*4;
    编译 java编译器将把所有使用这个常量的地方用3代替(即:int b=3*4, 当然是字节码形式啦),
         public static final int a = 3;这句话就不需要啦,不会编译进去啦,当然运行的时候也谈不上占用内存啦
      

  4.   

    按照楼上说的。。
    那public static final int a = 3;不放在常量池中吗。?
    程序不结束能释放掉吗
      

  5.   

    就是放在常量池里.
    测试: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}
      

  6.   

    按楼上所说的:
    public static final int a = 3;这句话就不需要啦,不会编译进去啦,当然运行的时候也谈不上占用内存啦 运行时不占内存那么public static final int a = 3;放到常量池中就不占内存了吗。。?
      

  7.   

    那总的来说还是占内存吧。。
    只是编译的时候就执行public static final int a = 3;属于编译期常量吧
    运行时候就不会在调用public static final int a = 3;了吧 。。
      

  8.   

    不过如果其他类中对这个a进行访问的话,可能就直接替换掉了.
    比如public class Test3{
       public static void main(String[] args){
            System.out.println(Main.a);
       }
    }这里用到了Main中的static final的,编译的时候就直接替换掉了.而且主要通过编译,这个class文件中就不保存任何关于Main类的信息了,这个角度看应该是省内存的吧.
      

  9.   

    就是这句 System.out.println(Main.a);
    之间编译为System.out.println(3);了.编译之后就完全和Main这个类没有关系了.
    加载的时候也不会把Main.class加载了.
      

  10.   

    哦。 这样啊。
    那就明白了 非常感谢啊 
    以后要跟着ZangXT多学习了