源码比对

java代码
public class Puppy{
int puppyAge;
public Puppy(String name){
// 这个构造器仅有一个参数:name
System.out.println("小狗的名字是 : " + name );
}

public void setAge( int age ){
puppyAge = age;
}

public int getAge( ){
System.out.println("小狗的年龄为 : " + puppyAge );
return puppyAge;
}

public static void main(String []args){
/* 创建对象 /
Puppy myPuppy = new Puppy( "tommy" );
/
通过方法来设定age /
myPuppy.setAge( 2 );
/
调用另一个方法获取age /
myPuppy.getAge( );
/
你也可以像下面这样访问成员变量 */
System.out.println("变量值 : " + myPuppy.puppyAge );
}
}
反编译后的代码
Compiled from "Puppy.java"
public class Puppy {
int puppyAge;

public Puppy(java.lang.String);
Code:
0: aload_0
从局部变量0中装载引用类型值
1: invokespecial #1 // Method java/lang/Object."<init>":()V
根据编译时类型来调用实例方法
4: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
从类中获取静态字段
7: new #3 // class java/lang/StringBuilder
创建一个新对象
10: dup
复制栈顶部一个字长内容
11: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
根据编译时类型来调用实例方法
14: ldc #5 // String 小狗的名字是 :
把常量池中的项压入栈
16: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
调度对象的实例方法
19: aload_1
从局部变量1中装载引用类型值
20: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
调度对象的实例方法
23: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
26: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
29: return
从方法中返回,返回值为void
public void setAge(int);
Code:
0: aload_0
从局部变量0中装载引用类型值
1: iload_1
从局部变量1中装载int类型值
2: putfield #9 // Field puppyAge:I
设置对象中字段的值
5: return
从方法中返回,返回值为void

public int getAge();
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
从局部变量0中装载引用类型值
3: new #3 // class java/lang/StringBuilder
创建一个新对象
6: dup
复制栈顶部一个字长内容
7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
根据编译时类型来调用实例方法
10: ldc #10 // String 小狗的年龄为 :
把常量池中的项压入栈
12: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
调度对象的实例方法
15: aload_0
从局部变量0中装载引用类型值
16: getfield #9 // Field puppyAge:I
从对象中获取字段
19: invokevirtual #11 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
调度对象的实例方法
22: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
调度对象的实例方法
25: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
调度对象的实例方法
28: aload_0
从局部变量0中装载引用类型值
29: getfield #9 // Field puppyAge:I
从对象中获取字段
32: ireturn
从方法中返回int类型的数据
public static void main(java.lang.String[]);
Code:
0: new #12 // class Puppy
3: dup
4: ldc #13 // String tommy
6: invokespecial #14 // Method "<init>":(Ljava/lang/String;)V
9: astore_1
10: aload_1
11: iconst_2
将int类型常量2压入栈
12: invokevirtual #15 // Method setAge:(I)V
15: aload_1
16: invokevirtual #16 // Method getAge:()I
19: pop
20: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
23: new #3 // class java/lang/StringBuilder
26: dup
27: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
30: ldc #17 // String 变量值 :
32: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
35: aload_1
36: getfield #9 // Field puppyAge:I
39: invokevirtual #11 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
42: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
45: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
48: return
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容