允许Java方法中的递归调用?

时间:2012-10-04 12:56:52

标签: c# java .net

我对这段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;
     }
 }

3 个答案:

答案 0 :(得分:7)

它不是自称。如果你看这里:

init(new byte[data_length]);

代码实际上正在构造一个新的byte[],然后在调用另一个init方法时使用它。 Java允许方法重载,因此并非所有init方法都相同。

答案 1 :(得分:3)

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

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

班级Message或其中一个超类包含其他init方法 - 您没有向我们展示。

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

答案 2 :(得分:2)

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