1

クラス A と B の 2 つのクラスがあります。クラス A には main メソッドがあり、クラス B には と の 2 つのメソッドがAddありSubます。

私の質問は、クラス B にメモリが割り当てられるのはいつですか?

行番号で。2または8; クラスをインポートするとき、またはクラスを呼び出すときは?

行番号でメモリが割り当てられている場合。2. 行番号で。3 java.util.* をインポートしたので、util パッケージ内のすべてのクラスにオブジェクトが割り当てられます。

行番号でメモリが割り当てられている場合。8 では、sub メソッドはどうでしょうか。

クラスA

   1 package sample;
   2 import sample1.B;
   3 import java.util.*;
   4 public class A 
   5 {
   6    public static void main(String args[])
   7    {
   8        B.Add(3, 3);
   9    }
   10 }

クラスB

package sample1;
public class B 
{
    public static int Add(int A,int B)
    {
        return A+B;
    }
    public static int sub(int A,int B)
    {
        return A-B;
    }
}
4

2 に答える 2

5

2 行目は、JVM バイトコード命令に変換されるコードではありません。これは、単純な名前の解決を支援するためのコンパイラへの宣言にすぎません。

8 行目の直前は、 forが実行され、 for の静的初期化子 (存在する場合) が実行される可能性のある最新の瞬間です。ただし、forの実行はそれ以前に発生する可能性があります。この仕様は、オブジェクトが最初に使用される前までに 1 回だけロードされること、および静的初期化子が必要になる最初の瞬間の直前に 1 回だけ実行されることを保証するだけです。ClassLoaderBBClassLoaderBClass

3 行目で java.util.* をインポートしたので、util パッケージのすべてのクラスにオブジェクトが割り当てられます。

いいえ、繰り返しますが、import宣言はJVM バイトコード命令に変換されません。実行時にオブジェクトが作成またはロードされることはありません。これは、コンパイラが単純な名前を解決するために使用する宣言にすぎません。Setの代わりにこう言えますjava.util.Set

8行目でメモリが割り当てられている場合、subメソッドはどうなりますか?

ClassLoaderforBと静的初期化子 forBは、8 行目が実行される前に実行され、 class の追加の静的メンバーを呼び出しても再度実行されることはありませんB

于 2013-08-17T19:16:53.737 に答える