什么会写进常量池?

来源:互联网 发布:表单序列化成json 编辑:程序博客网 时间:2024/05/29 15:24

  写进常量池:

 // 基本类型: final修饰(与static属性无关,非final不行), 成员变量(非成员不行),常量表达式赋值(其他类方法get不行)
 // 字符串: 常量表达式赋值即可

  写进方法: 

 // 基本类型: 常量表达式赋值(其他类方法get不行); 可以不是final
 // 字符串: 常量表达式赋值即可


从这点看,不想写进类信息里面的常量表达式(方法返回或者NULL),只能是基本类型成员变量且非FINAL.

 

可见,不可变是是否写进类信息的根本,STRING都是如此,基本类型在方法里面等于不可变,而在类成员里面必须是FINAL的。

 

package com.cisco.dms;


 
public class ClassDemo {
 
final int finalIntOther = UserForClass.INT_101; // only yes
final static int finalStaticInt = 3; // only yes
final int finalInt = 1; // only yes


final String finalString = "1";
final String finalStringObject = new String("2");
final static String finalStaticString = "3";
String commonString = "4";
static String staitcString = "5";
final String finalStringOther = UserForClass.String_101;
String CommonStringOther = UserForClass.String_105;


  final Integer finalInteger = new Integer(2);
int commonInt = 4;
static int staitcInt = 5;
int commonIntOther = UserForClass.INT_105;
final int finalIntOtherFromMethod = UserForClass.INT_102_FROM_METHOD;
String CommonStringOtherFromMethod = new String(
UserForClass.String_102_FROM_METHOD); // no


int testInt() {


  final int finalInt_Method = 6;
int commonInt_Method = 7;
final int finalIntOther_3 = UserForClass.INT_103;
final int finalIntOther_4 = UserForClass.INT_104_FROM_METHOD;
int commonIntOther_6 = UserForClass.INT_106;


System.out.println(8);
System.out.println(new Integer(9));
return 10;
}


String testString() {


  final String finalString = "6";
String commonString = "7";
final String finalStringOther_3 = UserForClass.String_103;
final String finalStringOther_4 = UserForClass.String_104_FROM_METHOD; // no
System.out.println("8");
System.out.println(new String(UserForClass.String_105));
System.out.println(new String(UserForClass.String_NULL));


return "9";
}


public static void main(String[] args) {
System.out.println();
}
}




package com.cisco.dms;
class UserForClass {
public static final int INT_101 = 101;
public static final int INT_102_FROM_METHOD = getInt102();
public static final int INT_103 = 103;
public static final int INT_104_FROM_METHOD = getInt104();
public static final int INT_105 = 105;
public static final int INT_106 = 106;
 
public static final String String_101 = "101";
public static final String String_102_FROM_METHOD = getString102();
public static final String String_103 = "103";
public static final String String_104_FROM_METHOD = getString104();
public static final String String_105 = "105";
public static final String String_NULL = null;


private static int getInt102() {
return 102;
}


private static int getInt104() {
return 104;
}


private static java.lang.String getString102() {
return "102";
}


private static java.lang.String getString104() {
return "104";
}
}







Classfile /E:/ClassDemo.class
  Last modified 2012-2-18; size 2389 bytes
  MD5 checksum 57b1f62e65ec1c8c39063922657768f9
  Compiled from "ClassDemo.java"
public class com.cisco.dms.ClassDemo
  SourceFile: "ClassDemo.java"
  minor version: 0
  major version: 50
  flags: ACC_PUBLIC, ACC_SUPER


Constant pool:
    #1 = Class              #2            //  com/cisco/dms/ClassDemo
    #2 = Utf8               com/cisco/dms/ClassDemo
    #3 = Class              #4            //  java/lang/Object
    #4 = Utf8               java/lang/Object
    #5 = Utf8               finalIntOther
    #6 = Utf8               I
    #7 = Utf8               ConstantValue
    #8 = Integer            101
    #9 = Utf8               finalStaticInt
   #10 = Integer            3
   #11 = Utf8               finalInt
   #12 = Integer            1
   #13 = Utf8               finalString
   #14 = Utf8               Ljava/lang/String;
   #15 = String             #16           //  1
   #16 = Utf8               1
   #17 = Utf8               finalStringObject
   #18 = Utf8               finalStaticString
   #19 = String             #20           //  3
   #20 = Utf8               3
   #21 = Utf8               commonString
   #22 = Utf8               staitcString
   #23 = Utf8               finalStringOther
   #24 = String             #25           //  101
   #25 = Utf8               101
   #26 = Utf8               CommonStringOther
   #27 = Utf8               finalInteger
   #28 = Utf8               Ljava/lang/Integer;
   #29 = Utf8               commonInt
   #30 = Utf8               staitcInt
   #31 = Utf8               commonIntOther
   #32 = Utf8               finalIntOtherFromMethod
   #33 = Utf8               CommonStringOtherFromMethod
   #34 = Utf8               <clinit>
   #35 = Utf8               ()V
   #36 = Utf8               Code
   #37 = String             #38           //  5
   #38 = Utf8               5
   #39 = Fieldref           #1.#40        //  com/cisco/dms/ClassDemo.staitcString:Ljava/lang/String;
   #40 = NameAndType        #22:#14       //  staitcString:Ljava/lang/String;
   #41 = Fieldref           #1.#42        //  com/cisco/dms/ClassDemo.staitcInt:I
   #42 = NameAndType        #30:#6        //  staitcInt:I
   #43 = Utf8               LineNumberTable
   #44 = Utf8               LocalVariableTable
   #45 = Utf8               <init>
   #46 = Methodref          #3.#47        //  java/lang/Object."<init>":()V
   #47 = NameAndType        #45:#35       //  "<init>":()V
   #48 = Fieldref           #1.#49        //  com/cisco/dms/ClassDemo.finalIntOther:I
   #49 = NameAndType        #5:#6         //  finalIntOther:I
   #50 = Fieldref           #1.#51        //  com/cisco/dms/ClassDemo.finalInt:I
   #51 = NameAndType        #11:#6        //  finalInt:I
   #52 = Fieldref           #1.#53        //  com/cisco/dms/ClassDemo.finalString:Ljava/lang/String;
   #53 = NameAndType        #13:#14       //  finalString:Ljava/lang/String;
   #54 = Class              #55           //  java/lang/String
   #55 = Utf8               java/lang/String
   #56 = String             #57           //  2
   #57 = Utf8               2
   #58 = Methodref          #54.#59       //  java/lang/String."<init>":(Ljava/lang/String;)V
   #59 = NameAndType        #45:#60       //  "<init>":(Ljava/lang/String;)V
   #60 = Utf8               (Ljava/lang/String;)V
   #61 = Fieldref           #1.#62        //  com/cisco/dms/ClassDemo.finalStringObject:Ljava/lang/String;
   #62 = NameAndType        #17:#14       //  finalStringObject:Ljava/lang/String;
   #63 = String             #64           //  4
   #64 = Utf8               4
   #65 = Fieldref           #1.#66        //  com/cisco/dms/ClassDemo.commonString:Ljava/lang/String;
   #66 = NameAndType        #21:#14       //  commonString:Ljava/lang/String;
   #67 = Fieldref           #1.#68        //  com/cisco/dms/ClassDemo.finalStringOther:Ljava/lang/String;
   #68 = NameAndType        #23:#14       //  finalStringOther:Ljava/lang/String;
   #69 = String             #70           //  105
   #70 = Utf8               105
   #71 = Fieldref           #1.#72        //  com/cisco/dms/ClassDemo.CommonStringOther:Ljava/lang/String;
   #72 = NameAndType        #26:#14       //  CommonStringOther:Ljava/lang/String;
   #73 = Class              #74           //  java/lang/Integer
   #74 = Utf8               java/lang/Integer
   #75 = Methodref          #73.#76       //  java/lang/Integer."<init>":(I)V
   #76 = NameAndType        #45:#77       //  "<init>":(I)V
   #77 = Utf8               (I)V
   #78 = Fieldref           #1.#79        //  com/cisco/dms/ClassDemo.finalInteger:Ljava/lang/Integer;
   #79 = NameAndType        #27:#28       //  finalInteger:Ljava/lang/Integer;
   #80 = Fieldref           #1.#81        //  com/cisco/dms/ClassDemo.commonInt:I
   #81 = NameAndType        #29:#6        //  commonInt:I
   #82 = Fieldref           #1.#83        //  com/cisco/dms/ClassDemo.commonIntOther:I
   #83 = NameAndType        #31:#6        //  commonIntOther:I
   #84 = Fieldref           #85.#87       //  com/cisco/dms/UserForClass.INT_102_FROM_METHOD:I
   #85 = Class              #86           //  com/cisco/dms/UserForClass
   #86 = Utf8               com/cisco/dms/UserForClass
   #87 = NameAndType        #88:#6        //  INT_102_FROM_METHOD:I
   #88 = Utf8               INT_102_FROM_METHOD
   #89 = Fieldref           #1.#90        //  com/cisco/dms/ClassDemo.finalIntOtherFromMethod:I
   #90 = NameAndType        #32:#6        //  finalIntOtherFromMethod:I
   #91 = Fieldref           #85.#92       //  com/cisco/dms/UserForClass.String_102_FROM_METHOD:Ljava/lang/String;
   #92 = NameAndType        #93:#14       //  String_102_FROM_METHOD:Ljava/lang/String;
   #93 = Utf8               String_102_FROM_METHOD
   #94 = Fieldref           #1.#95        //  com/cisco/dms/ClassDemo.CommonStringOtherFromMethod:Ljava/lang/String;
   #95 = NameAndType        #33:#14       //  CommonStringOtherFromMethod:Ljava/lang/String;
   #96 = Utf8               this
   #97 = Utf8               Lcom/cisco/dms/ClassDemo;
   #98 = Utf8               testInt
   #99 = Utf8               ()I
  #100 = Fieldref           #85.#101      //  com/cisco/dms/UserForClass.INT_104_FROM_METHOD:I
  #101 = NameAndType        #102:#6       //  INT_104_FROM_METHOD:I
  #102 = Utf8               INT_104_FROM_METHOD
  #103 = Fieldref           #104.#106     //  java/lang/System.out:Ljava/io/PrintStream;
  #104 = Class              #105          //  java/lang/System
  #105 = Utf8               java/lang/System
  #106 = NameAndType        #107:#108     //  out:Ljava/io/PrintStream;
  #107 = Utf8               out
  #108 = Utf8               Ljava/io/PrintStream;
  #109 = Methodref          #110.#112     //  java/io/PrintStream.println:(I)V
  #110 = Class              #111          //  java/io/PrintStream
  #111 = Utf8               java/io/PrintStream
  #112 = NameAndType        #113:#77      //  println:(I)V
  #113 = Utf8               println
  #114 = Methodref          #110.#115     //  java/io/PrintStream.println:(Ljava/lang/Object;)V
  #115 = NameAndType        #113:#116     //  println:(Ljava/lang/Object;)V
  #116 = Utf8               (Ljava/lang/Object;)V
  #117 = Utf8               finalInt_Method
  #118 = Utf8               commonInt_Method
  #119 = Utf8               finalIntOther_3
  #120 = Utf8               finalIntOther_4
  #121 = Utf8               commonIntOther_6
  #122 = Utf8               testString
  #123 = Utf8               ()Ljava/lang/String;
  #124 = String             #125          //  6
  #125 = Utf8               6
  #126 = String             #127          //  7
  #127 = Utf8               7
  #128 = String             #129          //  103
  #129 = Utf8               103
  #130 = Fieldref           #85.#131      //  com/cisco/dms/UserForClass.String_104_FROM_METHOD:Ljava/lang/String;
  #131 = NameAndType        #132:#14      //  String_104_FROM_METHOD:Ljava/lang/String;
  #132 = Utf8               String_104_FROM_METHOD
  #133 = String             #134          //  8
  #134 = Utf8               8
  #135 = Methodref          #110.#136     //  java/io/PrintStream.println:(Ljava/lang/String;)V
  #136 = NameAndType        #113:#60      //  println:(Ljava/lang/String;)V
  #137 = Fieldref           #85.#138      //  com/cisco/dms/UserForClass.String_NULL:Ljava/lang/String;
  #138 = NameAndType        #139:#14      //  String_NULL:Ljava/lang/String;
  #139 = Utf8               String_NULL
  #140 = String             #141          //  9
  #141 = Utf8               9
  #142 = Utf8               finalStringOther_3
  #143 = Utf8               finalStringOther_4
  #144 = Utf8               main
  #145 = Utf8               ([Ljava/lang/String;)V
  #146 = Methodref          #110.#147     //  java/io/PrintStream.println:()V
  #147 = NameAndType        #113:#35      //  println:()V
  #148 = Utf8               args
  #149 = Utf8               [Ljava/lang/String;
  #150 = Utf8               SourceFile
  #151 = Utf8               ClassDemo.java
{
  final int finalIntOther;
    flags: ACC_FINAL


    ConstantValue: int 101


  static final int finalStaticInt;
    flags: ACC_STATIC, ACC_FINAL


    ConstantValue: int 3


  final int finalInt;
    flags: ACC_FINAL


    ConstantValue: int 1


  final java.lang.String finalString;
    flags: ACC_FINAL


    ConstantValue: String 1


  final java.lang.String finalStringObject;
    flags: ACC_FINAL




  static final java.lang.String finalStaticString;
    flags: ACC_STATIC, ACC_FINAL


    ConstantValue: String 3


  java.lang.String commonString;
    flags: 




  static java.lang.String staitcString;
    flags: ACC_STATIC




  final java.lang.String finalStringOther;
    flags: ACC_FINAL


    ConstantValue: String 101


  java.lang.String CommonStringOther;
    flags: 




  final java.lang.Integer finalInteger;
    flags: ACC_FINAL




  int commonInt;
    flags: 




  static int staitcInt;
    flags: ACC_STATIC




  int commonIntOther;
    flags: 




  final int finalIntOtherFromMethod;
    flags: ACC_FINAL




  java.lang.String CommonStringOtherFromMethod;
    flags: 




  static {};
    flags: ACC_STATIC


    Code:
      stack=1, locals=0, args_size=0
         0: ldc           #37                 // String 5
         2: putstatic     #39                 // Field staitcString:Ljava/lang/String;
         5: iconst_5      
         6: putstatic     #41                 // Field staitcInt:I
         9: return        
      LineNumberTable:
        line 14: 0
        line 20: 5
        line 4: 9
      LocalVariableTable:
        Start  Length  Slot  Name   Signature


  public com.cisco.dms.ClassDemo();
    flags: ACC_PUBLIC


    Code:
      stack=4, locals=1, args_size=1
         0: aload_0       
         1: invokespecial #46                 // Method java/lang/Object."<init>":()V
         4: aload_0       
         5: bipush        101
         7: putfield      #48                 // Field finalIntOther:I
        10: aload_0       
        11: iconst_1      
        12: putfield      #50                 // Field finalInt:I
        15: aload_0       
        16: ldc           #15                 // String 1
        18: putfield      #52                 // Field finalString:Ljava/lang/String;
        21: aload_0       
        22: new           #54                 // class java/lang/String
        25: dup           
        26: ldc           #56                 // String 2
        28: invokespecial #58                 // Method java/lang/String."<init>":(Ljava/lang/String;)V
        31: putfield      #61                 // Field finalStringObject:Ljava/lang/String;
        34: aload_0       
        35: ldc           #63                 // String 4
        37: putfield      #65                 // Field commonString:Ljava/lang/String;
        40: aload_0       
        41: ldc           #24                 // String 101
        43: putfield      #67                 // Field finalStringOther:Ljava/lang/String;
        46: aload_0       
        47: ldc           #69                 // String 105
        49: putfield      #71                 // Field CommonStringOther:Ljava/lang/String;
        52: aload_0       
        53: new           #73                 // class java/lang/Integer
        56: dup           
        57: iconst_2      
        58: invokespecial #75                 // Method java/lang/Integer."<init>":(I)V
        61: putfield      #78                 // Field finalInteger:Ljava/lang/Integer;
        64: aload_0       
        65: iconst_4      
        66: putfield      #80                 // Field commonInt:I
        69: aload_0       
        70: bipush        105
        72: putfield      #82                 // Field commonIntOther:I
        75: aload_0       
        76: getstatic     #84                 // Field com/cisco/dms/UserForClass.INT_102_FROM_METHOD:I
        79: putfield      #89                 // Field finalIntOtherFromMethod:I
        82: aload_0       
        83: new           #54                 // class java/lang/String
        86: dup           
        87: getstatic     #91                 // Field com/cisco/dms/UserForClass.String_102_FROM_METHOD:Ljava/lang/String;
        90: invokespecial #58                 // Method java/lang/String."<init>":(Ljava/lang/String;)V
        93: putfield      #94                 // Field CommonStringOtherFromMethod:Ljava/lang/String;
        96: return        
      LineNumberTable:
        line 4: 0
        line 6: 4
        line 8: 10
        line 10: 15
        line 11: 21
        line 13: 34
        line 15: 40
        line 16: 46
        line 18: 52
        line 19: 64
        line 21: 69
        line 22: 75
        line 23: 82
        line 23: 83
        line 24: 87
        line 4: 96
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0      97     0  this   Lcom/cisco/dms/ClassDemo;


  int testInt();
    flags: 


    Code:
      stack=4, locals=6, args_size=1
         0: bipush        6
         2: istore_1      
         3: bipush        7
         5: istore_2      
         6: bipush        103
         8: istore_3      
         9: getstatic     #100                // Field com/cisco/dms/UserForClass.INT_104_FROM_METHOD:I
        12: istore        4
        14: bipush        106
        16: istore        5
        18: getstatic     #103                // Field java/lang/System.out:Ljava/io/PrintStream;
        21: bipush        8
        23: invokevirtual #109                // Method java/io/PrintStream.println:(I)V
        26: getstatic     #103                // Field java/lang/System.out:Ljava/io/PrintStream;
        29: new           #73                 // class java/lang/Integer
        32: dup           
        33: bipush        9
        35: invokespecial #75                 // Method java/lang/Integer."<init>":(I)V
        38: invokevirtual #114                // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
        41: bipush        10
        43: ireturn       
      LineNumberTable:
        line 28: 0
        line 29: 3
        line 30: 6
        line 31: 9
        line 32: 14
        line 34: 18
        line 35: 26
        line 36: 41
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0      44     0  this   Lcom/cisco/dms/ClassDemo;
               3      41     1 finalInt_Method   I
               6      38     2 commonInt_Method   I
               9      35     3 finalIntOther_3   I
              14      30     4 finalIntOther_4   I
              18      26     5 commonIntOther_6   I


  java.lang.String testString();
    flags: 


    Code:
      stack=4, locals=5, args_size=1
         0: ldc           #124                // String 6
         2: astore_1      
         3: ldc           #126                // String 7
         5: astore_2      
         6: ldc           #128                // String 103
         8: astore_3      
         9: getstatic     #130                // Field com/cisco/dms/UserForClass.String_104_FROM_METHOD:Ljava/lang/String;
        12: astore        4
        14: getstatic     #103                // Field java/lang/System.out:Ljava/io/PrintStream;
        17: ldc           #133                // String 8
        19: invokevirtual #135                // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        22: getstatic     #103                // Field java/lang/System.out:Ljava/io/PrintStream;
        25: new           #54                 // class java/lang/String
        28: dup           
        29: ldc           #69                 // String 105
        31: invokespecial #58                 // Method java/lang/String."<init>":(Ljava/lang/String;)V
        34: invokevirtual #135                // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        37: getstatic     #103                // Field java/lang/System.out:Ljava/io/PrintStream;
        40: new           #54                 // class java/lang/String
        43: dup           
        44: getstatic     #137                // Field com/cisco/dms/UserForClass.String_NULL:Ljava/lang/String;
        47: invokespecial #58                 // Method java/lang/String."<init>":(Ljava/lang/String;)V
        50: invokevirtual #135                // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        53: ldc           #140                // String 9
        55: areturn       
      LineNumberTable:
        line 41: 0
        line 42: 3
        line 43: 6
        line 44: 9
        line 45: 14
        line 46: 22
        line 47: 37
        line 49: 53
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0      56     0  this   Lcom/cisco/dms/ClassDemo;
               3      53     1 finalString   Ljava/lang/String;
               6      50     2 commonString   Ljava/lang/String;
               9      47     3 finalStringOther_3   Ljava/lang/String;
              14      42     4 finalStringOther_4   Ljava/lang/String;


  public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC


    Code:
      stack=1, locals=1, args_size=1
         0: getstatic     #103                // Field java/lang/System.out:Ljava/io/PrintStream;
         3: invokevirtual #146                // Method java/io/PrintStream.println:()V
         6: return        
      LineNumberTable:
        line 53: 0
        line 54: 6
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       7     0  args   [Ljava/lang/String;
}

原创粉丝点击