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不可以(算另外一个类的字段算本类的字段)
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();}
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();}}
java代码--->javac--->java字节码--->常量池--->
4.常量里面都是符号表(数组的下标) 上面4个常量,都是使用的类,字段,方法,接口信息
javap -v(熟悉后)
5.(面试题)java中的接口的超类(基类)是不是Object
!!!答:本类和父类和使用的类都会进入class_info常量池,官网说 所有类都有object声明(关联) 字面量--->字面知道内容是什么
6.string static final 和其他的字符串定义
CONSTANT_String_info{ u1 tag;u2 string_index;//指向CONSTANT_Utf8_info常量}
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{ }
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; }}
上一篇:明·行痴封剑辞夺楼兰
下一篇:我给你唱首歌吧!,请听我说