###前提
Java構文を知りたいわけではなく、JVMの内部実装を理解するのが目的です。
###実現したいこと
どのようにメソッドや変数が呼び出されるかを知る。またアップキャストによるインスタンスのヘッダの変化やロック情報の変化があるのかいなか。
該当のソースコード
java
1class AA{ 2 private int i; 3 4 public void hello(){ 5 System.out.println("Hello"); 6 } 7} 8class BB extends AA{ 9 private int j; 10 11 public void yeah(){ 12 System.out.println("Yeah!"); 13 } 14} 15 16class Test{ 17 public static void main(String[] args){ 18 AA aa = new AA(); 19 BB bb = new BB(); 20 21 aa.hello(); 22 23 aa = bb;//アップキャスト 24 25 aa.yeah();//コンパイルエラー 26 aa.i = 1;//コンパイルエラー 27 aa.j = 2;//コンパイルエラー 28 } 29}
### 質問
1. "aa.hello();"を実行する際、コンピュータは参照型変数"aa"自体の型を見て、その型のクラスにアクセスするのか、参照型変数"aa"の指し示す先のインスタンスのヘッダにある"このインスタンスはどこのクラスに属するものか"という情報を参考にクラスにアクセスするのか、はたまた別の方法なのかがわかりません。
2. アップキャスト時に、参照型変数"bb"の指し示す先のインスタンスのヘッダの情報は変更されるのでしょうか? また、変数などのロック情報も変更されるのでしょうか?
3. "aa.yeah()"でコンパイルエラーになるのはどうしてでしょうか? 質問1と質問2の内容を関連付けて説明していただけると助かります。
4. "aa.i"と"aa.j"が下記のようなエラーを発生させるのがなぜだかわかりません。こちらも質問1と質問2の内容に関連させて説明いただけると助かります。
以上、全体を通してJVM上での動きを問う質問です。JVM上での動きに焦点を当てた回答をいただけると助かります。
###コンパイルエラー
Test.java:25: エラー: シンボルを見つけられません aa.yeah();//コンパイルエラー ^ シンボル: メソッド yeah() 場所: タイプAAの変数 aa Test.java:26: エラー: iはAAでprivateアクセスされます aa.i = 1; ^ Test.java:27: エラー: シンボルを見つけられません aa.j = 2; ^ シンボル: 変数 j 場所: タイプAAの変数 aa エラー3個
回答6件
あなたの回答
tips
プレビュー