0

この Java コード (Message と呼ばれるクラス) には本当に困惑しています。2 番目のコンストラクターはdata_length値で初期化するように設定されていると思います。この目的のために、ご覧のように名前が付けられたメソッドを呼び出しinitます。

しかし、内部initで何が起こっているのかというと、机に頭をぶつけてしまいます :D このメソッドの内部では何が起こっているのでしょうか? なぜそれは自分自身を呼んでいるのですか??

  /**
   * The actual length of the message data. Must be less than or equal to
   * (data.length - base_offset).
   */
  protected int data_length;


  /** Limit no-arg instantiation. */
  protected Message() {
  }

  /**
   * Construct a new message of the given size.
   * 
   * @param data_length
   *          The size of the message to create.
   */
  public Message(int data_length) {
    init(data_length);
  }

  public void init(int data_length) {
    init(new byte[data_length]);
  }

このコードを C# に変換しています。

public class Message
{    
     //blah blah and more blah

     private int _dataLength;

     public Message(int dataLength)
     {
         _dataLength = dataLength;
     }
 }
4

3 に答える 3

7

それは自分自身を呼んでいません。ここを見ると:

init(new byte[data_length]);

コードは実際に new を構築しており、これは別のメソッドbyte[]の呼び出しで使用されます。initJava ではメソッドのオーバーロードが許可されているため、すべてのinitメソッドが同じというわけではありません。

于 2012-10-04T12:58:29.197 に答える
3
public void init(int data_length) {
    init(new byte[data_length]);
}

それは自分自身を呼び出していません。initパラメータとして aを取るという名前の別のメソッドを呼び出しbyte[]ています。

クラスMessageまたはそのスーパークラスの 1 つに他のinitメソッドが含まれています - あなたは私たちにそれを示していません。

名前が同じでパラメーターの型が異なるさまざまなメソッドを作成することを、メソッドのオーバーロードと呼びます。

于 2012-10-04T12:58:54.610 に答える
2

Javaでは再帰が許可されていますが、あなたの例init()ではそれ自体を呼び出していませんinit()が、バイト配列を引数として取る別のメソッドです(投稿したコードには含まれていません)。

于 2012-10-04T12:59:16.760 に答える