1

Step1: 次のコードをコンパイルしました。

public class OuterClass {
class InnerClass{

    }
}  

私は OuterClass.class と OterClass$InnerClass.class を持っています

Step2: javap を使用して内部クラスのバイトコードをチェックします。コンストラクター メソッドが "1: aload_1" を使用するのは非常に奇妙ですが、LocalVariableTable には、aload_0 でアクセスできる "this" のエントリが 1 つしかありません。aload_1 は、渡されたパラメーター (外部クラス オブジェクトの参照) をスタックの一番上にロードすると仮定します。

私の質問: コンパイラがエントリ (コンストラクタに渡される外部クラスの参照) を作成しないのはなぜですか?

私はJsdk 1.4とopenjdk 1.6で試しました。

~$ javap -v -c OuterClass\$InnerClass
Compiled from "OuterClass.java"
class OuterClass$InnerClass extends java.lang.Object
  SourceFile: "OuterClass.java"
  InnerClass: 
   #24= #1 of #22; //InnerClass=class OuterClass$InnerClass of class OuterClass
  minor version: 0
  major version: 50
  Constant pool:
const #1 = class    #2; //  OuterClass$InnerClass
const #2 = Asciz    OuterClass$InnerClass;
const #3 = class    #4; //  java/lang/Object
const #4 = Asciz    java/lang/Object;
const #5 = Asciz    this$0;
const #6 = Asciz    LOuterClass;;
const #7 = Asciz    <init>;
const #8 = Asciz    (LOuterClass;)V;
const #9 = Asciz    Code;
const #10 = Field   #1.#11; //  OuterClass$InnerClass.this$0:LOuterClass;
const #11 = NameAndType #5:#6;//  this$0:LOuterClass;
const #12 = Method  #3.#13; //  java/lang/Object."<init>":()V
const #13 = NameAndType #7:#14;//  "<init>":()V
const #14 = Asciz   ()V;
const #15 = Asciz   LineNumberTable;
const #16 = Asciz   LocalVariableTable;
const #17 = Asciz   this;
const #18 = Asciz   LOuterClass$InnerClass;;
const #19 = Asciz   SourceFile;
const #20 = Asciz   OuterClass.java;
const #21 = Asciz   InnerClasses;
const #22 = class   #23;    //  OuterClass
const #23 = Asciz   OuterClass;
const #24 = Asciz   InnerClass;

{
final OuterClass this$0;


OuterClass$InnerClass(OuterClass);
  Code:
   Stack=2, Locals=2, Args_size=2
   0:   aload_0
   1:   aload_1
   2:   putfield    #10; //Field this$0:LOuterClass;
   5:   aload_0
   6:   invokespecial   #12; //Method java/lang/Object."<init>":()V
   9:   return
  LineNumberTable: 
   line 3: 0

  LocalVariableTable: 
   Start  Length  Slot  Name   Signature
   0      10      0    this       LOuterClass$InnerClass;


}
4

2 に答える 2

0

引数として以外の方法で参照される必要がない引数であるため、ローカル変数テーブルにエントリを必要としないためだと思います。

于 2012-04-05T19:17:55.093 に答える