Java 为什么非静态方法有额外的局部性?那是什么?
根据我对方法1中每个局部变量定义的理解,局部变量是为该局部变量指标添加的 资料来源:Java 为什么非静态方法有额外的局部性?那是什么?,java,jvm,bytecode,Java,Jvm,Bytecode,根据我对方法1中每个局部变量定义的理解,局部变量是为该局部变量指标添加的 资料来源: public class A { public void a() {} public static void b() {} } 生成的字节码: Compiled from "A.java" public class A extends java.lang.Object SourceFile: "A.java" minor version: 0 major version: 50
public class A {
public void a() {}
public static void b() {}
}
生成的字节码:
Compiled from "A.java"
public class A extends java.lang.Object
SourceFile: "A.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #3.#12; // java/lang/Object."<init>":()V
const #2 = class #13; // A
const #3 = class #14; // java/lang/Object
const #4 = Asciz <init>;
const #5 = Asciz ()V;
const #6 = Asciz Code;
const #7 = Asciz LineNumberTable;
const #8 = Asciz a;
const #9 = Asciz b;
const #10 = Asciz SourceFile;
const #11 = Asciz A.java;
const #12 = NameAndType #4:#5;// "<init>":()V
const #13 = Asciz A;
const #14 = Asciz java/lang/Object;
{
public A();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
public void a();
Code:
Stack=0, Locals=1, Args_size=1
0: return
LineNumberTable:
line 6: 0
public static void b();
Code:
Stack=0, Locals=0, Args_size=0
0: return
LineNumberTable:
line 11: 0
}
从“A.java”编译而来
公共类A扩展了java.lang.Object
源文件:“A.java”
次要版本:0
主要版本:50
固定池:
常数#1=方法#3.#12;//java/lang/Object。“:()V
常数2=类13;//A.
常数3=类14;//java/lang/Object
常数4=Asciz;
常数#5=Asciz()V;
常量#6=Asciz代码;
常数#7=Asciz LineNumberTable;
常数#8=a;
常数#9=Asciz b;
const#10=Asciz源文件;
const#11=Asciz A.java;
常数#12=名称和类型#4:#5;//“”:()V
常数13=A;
const#14=Asciz java/lang/Object;
{
公共A();
代码:
堆栈=1,局部变量=1,参数大小=1
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:返回
LineNumberTable:
第1行:0
公共无效a();
代码:
堆栈=0,局部变量=1,参数大小=1
0:返回
LineNumberTable:
第6行:0
公共静态无效b();
代码:
堆栈=0,局部变量=0,参数大小=0
0:返回
LineNumberTable:
第11行:0
}
我猜它是这个
它是当前对象,也就是这个
。发件人:
在调用实例方法时,始终使用局部变量0
传递对调用实例方法的对象的引用(Java编程语言中的this
)
但直接引用规范比猜测要好:-)