存在继承关系的情况下,实例化子类时,父类中调用的this指向的是子类对象;或者说实例化的谁,this指向的就是谁。
从编译后的class文件看不出jvm是如何加载类的以及各个成员的加载顺序,但有助于了解方法内部的执行顺序和原理。
例如:
1、新建parent类
public class Parent {
protected String a="a";
static String p="p";
Class pc=this.getClass();
public Parent() {
System.out.println("parent");
}
}
2、新建son类
public class Son extends Parent{
String b="b";
static String s="s";
Class sc=this.getClass();
public Son(String b, Class sc) {
//super();
System.out.println("yes");
this.b = b;
this.sc = sc;
}
public Son() {
System.out.println("no");
//super();
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
try {
Son son=new Son();
System.out.println("sq");
} catch (Exception e) {
System.out.println("tt");
}
Son son2=new Son();
}
}
3、编译
javac Son.java Parent.java
4、查看class文件信息
javap -verbose Son
5、main方法
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: new #10 // class common/Son
3: dup
4: invokespecial #11 // Method "<init>":()V
7: astore_1
8: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;
11: ldc #12 // String sq
13: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
16: goto 28
19: astore_1
20: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;
23: ldc #14 // String tt
25: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
28: new #10 // class common/Son
31: dup
32: invokespecial #11 // Method "<init>":()V
35: astore_1
36: return
Exception table:
from to target type
0 16 19 Class java/lang/Exception
Code部分为编译后的字节码指令,代码中使用try…catch后,class文件中会多出Exception table信息,每一行代表一个try…catch信息。