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;
}
}