2012-10-04 51 views
0

我對這段Java代碼(一個名爲Message的類)非常困惑。我認爲第二個構造函數的初始化值爲data_length,爲此目的,它調用一個名爲init的方法,如您所見。允許使用Java方法進行遞歸調用?

但是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; 
    } 
} 
+6

它不是遞歸的。它是_overloaded_我不知道在哪裏定義了一個'init(byte [] buffer)' - 你沒有發佈它。 – Oded

+0

@mP。這有點意思 –

回答

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

它不會調用它自己;它調用另一個名爲init的方法,它將byte[]作爲參數。

Message或其一個超類包含其他init方法 - 您沒有向我們展示它。

創建具有相同名稱但不同參數類型的不同方法稱爲method overloading

7

它不是自稱。如果你看看這裏:

init(new byte[data_length]); 

的代碼實際上是建設一個新byte[],然後在調用另一個init方法使用。 Java允許方法重載,所以並不是所有的init方法都是一樣的。

2

在Java中允許遞歸,但在您的示例中,init()不會調用自己,而是另一個將字節數組作爲參數的方法(您未在發佈的代碼中包含此方法)。