• 04.jvm常量池01


    1.字段的使用

    CONSTANT_Fieldref_info{
    u1 tag;
    u2 class_index; //top/jamsee/MyStu,指向Class_info里面看
    u2 name_and_type_index; // 指向CONSTANT_NameAndType_info指向utf-8常量,就是只记录一个符号在里面然后层层指向
    //也分为 name 和type , }

       String name;//没有使用(赋值也是),不进常量池
       private String str1="aa"+name;//使用了进常量池,和修饰符无关
       static String str2="aaa";//进
       final String="vvv";//进
       static final String="vvv";//不进
        {
              int a=10;//局部变量不可以
    
         }
        static{
    	    boolean b=true;//不可以
         }
         public void fun1(){int a=10;//不可以}
       Person person=new Person();
        int aa=person.aa;//用另外一个类赋值也可以(使用其他类变量),但是这个类不能为 static final
        //在类内,方法体里面 int cc=person.aa;//aa也可以存在,但是cc不可以(算另外一个类的字段算本类的字段)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.方法常量(都要调用才进常量池)

    CONSTANT_Methodref_info{
    u1 tag;
    u2 class_index;//指向接口名 java.lang.Object
    u2 name_and_type_index;//名称和构造方法返回值 :()V }

    1.默认调用父类无参构造方法 :()V
    //自己写构造方法,并写个方法调用

      public Car(int a){};
      public  void func(){Car car=new Car(1);}   //:(Ijava/lang/int:)V
      //方法之间调用
       fun1(){
    
       } 
      fun2(){
           fun1();   // fun1:()V ,使用了func1进入常量池(void)
      }
     private String fun3(boolean b;int s,MyCat cat){   fun3 : (zILtop/jamsee/MyCat;)Ljava/lang/String;
             return null;
       }
       static void fun4(){}
        static final void fun5(){} //都可以进入
     //继承父类,构造方法改变
      class aa extends bb{}
       //其他地方没有写,这样调用父类也会进入,如果其他地方也调用,就是存在这个类和父类的fun6进入
       public void fun6(){super.fun6();}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.接口方法引用

    CONSTANT_InterfaceMethodref_info{
    u1 tag;
    u2 class_index;
    u2 name_and_type_index; }

      public interface IMyFood{
         void fun1();
      }
      public class MyFood extends IMyFood{
             public void fun1(){
                  MyFood.main(new String[]{"aaa"}); //main方法这样也会进入常量池,main方法由虚拟机调用一般不进入常量池
             }
          public static void main(String[] args){
    	MyFood myfood=new MyFood(); //自己的构造方法,父类的,构造方法
                    myfood.fun1();
                  IMyFood ifood=new MyFood();//多态会进入interfacemethod常量池
                    ifood.fun1();
          }
    
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
              java代码--->javac--->java字节码
                           --->常量池--->
    
    • 1
    • 2

    4.常量里面都是符号表(数组的下标) 上面4个常量,都是使用的类,字段,方法,接口信息

    javap -v(熟悉后)

    5.(面试题)java中的接口的超类(基类)是不是Object

     !!!答:本类和父类和使用的类都会进入class_info常量池,官网说 所有
                类都有object声明(关联) 
            字面量--->字面知道内容是什么
    
    • 1
    • 2
    • 3

    6.string static final 和其他的字符串定义

    CONSTANT_String_info{ 
                  u1 tag;
                 u2 string_index;//指向CONSTANT_Utf8_info常量
    
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    public class aaa{
    static final String str=“aaa”; //java语法层面的常量进入
    String str2=“bbb”; //bbb是常量也会进入
    public void fun1(){
    sout(“ok”);//也是
    }
    { sout(“ccc”); //实例块也可以
    }
    static{ String str3=“abc”+“def”; //在常量池进入abcdef整体,优化
    String str3=“ddd”+123; //也是整体
    }

    }

    7.integer(小于short范围直接进字节码里面)

    {
    u1 tag;
    u4 bytes; //4个字节8个位
    }

         //以下(是整数)都会进入常量池
         static final Integer a3=new Interger(666);
          static final int a=10;
          static final boolean b1=true;
           static final boolean b2=false;
         static final char c1='a';
          //8位  11111111 
         static final byte by1=20;
         static final short s1=30;
         int bb=5000;//可以进
        public void fun2(){
    	int a=50; //short范围内的不进入,在init方法里
                    int b=50000;//直接进入字节码的方法里面,优化
    
        }
       static{ 
    
         }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    8.float(如String int)

    CONSTANT_Float_info{
    u1 tag;
    u4 bytes;
    }
    fun4(64.9f);//字面量都进去,static final也可以进去

    9.面试题:区分实例块和静态块和构造方法谁先执行

    static{}>{}>init() 实例块比构造块先执行,(init<初始化阶段>查看) (存静态 clinit)
    static int a=500;//静态成员 和静态块放一起
    int b=700;//实例成员 和实例块 放在一起

    10.long

    CONSTANT_Long_Info{
    u1 tag;
    u4 high_bytes;
    u4 low_bytes; }

      public class c1{
               static final long l1=10;
               static long l2=20;
               public Myc(){
               	long l3=30;  
               }
    
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Boom 3D全新2022版音频增强应用程序App
    Nodejs错误处理详细指南
    高性能无线综合测试仪 无线电综合测试仪 ---TFN PM5100 100KHz-1GHz
    hadoop can‘t installation $HADOOP_HOME or $HADOOP_PREFIX must be set
    JVM学习-类加载机制
    Bash常见快捷键
    (十五)STM32——尝试把独立看门狗当成一款游戏来理解
    JVM学习——1——虚拟机基础概念
    数据增强Mixup原理与代码解读
    C++基础——指针
  • 原文地址:https://blog.csdn.net/weixin_47039303/article/details/127870791