0

我对这段 Java 代码(一个名为 Message 的类)感到非常困惑。我认为第二个构造函数设置为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[],然后在调用另一个init方法时使用它。Java 允许方法重载,因此并非所有init方法都相同。

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

它不是在呼唤自己;它正在调用另一个名为initabyte[]作为参数的方法。

该类Message或其超类之一包含其他init方法 - 您没有向我们展示它。

创建具有相同名称但参数类型不同的不同方法称为方法重载

于 2012-10-04T12:58:54.610 回答
2

Java 中允许递归,但在您的示例init()中不是调用自身,而是另init()一种将字节数组作为其参数的方法(您未包含在您发布的代码中)。

于 2012-10-04T12:59:16.760 回答