2013-05-31 63 views
0

如下所示,我將以下代碼作爲構造函數。但我想用不同的名字複製它。但我在這方面遇到了錯誤。我可以以某種方式進行修改以符合要求嗎?具有不同參數的相同構造函數

這是原代碼:

public HeyStatus(byte[] bytes) 
    { 
     this(); 

     int offset = 7; 
     for (int i = 1; i < 9; ++i) 
     { 
      partition1Status[i-1].status = (bytes[offset + i] & 0x0F); 
      partition2Status[i-1].status = (bytes[offset + i + 9] & 0x0F); 
     } 

     if((bytes[offset + 9] == 0) || (bytes[offset + 9] == 1)){ 
      isPartitioned = (bytes[offset + 9] == 0) ? false : true; 
     } 

     partition1Status.status = (bytes[offset + 18] - 0x30); 
     partition2Status.status = (bytes[offset + 19] - 0x30); 

     String model = "" + (char)bytes[1] + (char)bytes[2]; 
     if (model.equalsIgnoreCase("!A")) 
      modelNum = "T32"; 
    } 

我想以前的代碼之後添加以下代碼:

public HeyStatus(byte[] bytes2) <----the line I am getting error 
    { 
     this(); 

     int offset = 7; 
     for (int i = 1; i < 9; ++i) 
     { 
      partition3Status[i-1].status = (bytes[offset + i] & 0x0F); 
      partition4Status[i-1].status = (bytes[offset + i + 9] & 0x0F); 
     } 


     if((bytes[offset + 9] == 0) || (bytes[offset + 9] == 1)){ 
      isPartitioned = (bytes[offset + 9] == 0) ? false : true; 
     } 

     partition3Status.status = (bytes[offset + 18] - 0x30); 
     partition4Status.status = (bytes[offset + 19] - 0x30); 

     String model = "" + (char)bytes[1] + (char)bytes[2]; 
     if (model.equalsIgnoreCase("!A")) 
      modelNum = "T32"; 
    } 
+0

我想要完全一樣的簽名,你可以看到兩個構造函數中的代碼幾乎相同。這是關於不同數量的相同變量。 – Angela

+0

你看錯了嗎?我的字是熊〜 – Angela

+0

檢查編輯我的答案這是你的問題的解決方案,如果你不明白我會給更多的信息 – Hosni

回答

0
public HeyStatus(byte[] bytes) 
public HeyStatus(byte[] bytes2) 

兩者都是相同的聲明。您需要更改參數的類型(byte[])以重載構造函數。構造函數或方法重載基於簽名的差異。在這裏,您對構造函數定義使用相同的簽名,只是更改參數名稱,這是無效的。

閱讀Javadoc瞭解更多信息。

Java編程語言支持重載方法,Java可以區分具有不同方法簽名的方法。這意味着如果類中的方法具有不同的參數列表,則類中的方法可以具有相同的名稱。

0

您沒有更改構造函數簽名。這兩個構造函數具有相同類型:

public HeyStatus(byte[] bytes) 
public HeyStatus(byte[] bytes2) 

如果你提供了不同類型的參數,不同數量的參數,或兩者兼而有之,你可以定義多個構造函數名稱相同。它叫Constructor Overloaing

+0

但我想要的完全相同的簽名,你可以看到兩個構造函數中的代碼幾乎相同。這是關於不同數量的相同變量。 – Angela

+0

這只是定義。在調用它時,你可以在構造函數中傳遞不同的參數[在你的代碼中,不同的數字]。 – OguzOzkeroglu

3

這是一個method overloading的問題(構造函數是一種特殊的方法)。
總之,只能通過名稱和參數類型來區分兩種方法。

不能聲明多個方法具有相同的名稱和參數的 相同數量和類型,因爲編譯器不能告訴 它們分開。

0

在同一個類中不能有兩個具有相同簽名的方法。這也適用於構造函數。有沒有辦法讓編譯器知道,如果你這樣做你調用哪一個:

byte[] bytes = new bytes[]{1, 2, 3}; 
new HeyStatus(bytes); 
0

只需使用一個構造函數,當你把它放在這裏的參數範圍內適當的字節數組的簡化例如:

byte[] bytesOne[]= new bytes[]{1,2,3}; 
byte[] bytesTwo[] =new bytes[]{4,5,6}; 

HeyStatus hStatusOne = new HeyStatus(bytesOne); 
HeyStatus hStatusTwo = new HeyStatus(bytesTwo); 

但只有一個構造器。

P.S.如果你想使用更多的構造函數參數,它必須與第一個不同,在類型(不是名字)和/或數字。您可以通過使用Google搜索構造函數來獲取更多信息。

編輯:

只注意到與partion1Status [](和其他人)的差異把你partionStatus中的參數。

例如你的構造函數頭必須是這樣的:

public HeyStatus(byte[] bytes, typeOfpartionStatus partitionOneStatus, typeOfpartionStatus partitionTwoStatus){ 
this(); 

    int offset = 7; 
    for (int i = 1; i < 9; ++i) 
    { 
     partitionOneStatus[i-1].status = (bytes[offset + i] & 0x0F); 
     partitionTwoStatus[i-1].status = (bytes[offset + i + 9] & 0x0F); 
    } 


    if((bytes[offset + 9] == 0) || (bytes[offset + 9] == 1)){ 
     isPartitioned = (bytes[offset + 9] == 0) ? false : true; 
    } 

    partitionOneStatus.status = (bytes[offset + 18] - 0x30); 
    partitionTwoStatus.status = (bytes[offset + 19] - 0x30); 

    String model = "" + (char)bytes[1] + (char)bytes[2]; 
    if (model.equalsIgnoreCase("!A")) 
     modelNum = "T32"; 
} 

當你調用它,它一定是這樣的。

HeyStatus hstatusOne = new (bytesOne,partion1Status,partition2Status); 
HeyStatus hstatusTwo = new (bytesTwo,partion3Status,partition4Status); 
+0

現在我想我給了一切:) – Hosni

+0

我試過你的解決方案,發生了很多與此代碼相關的新錯誤。我現在正在調試以查看它是否可以解決。如果仍然存在,我會通知你。感謝您的熱心幫助。那些想投票的人,我不明白他們在想什麼。如果他們能夠提供幫助,他們可以給我答案。爲什麼不投票我的問題,因爲我說我是android應用程序開發的新手。 – Angela

+0

它是如此工作? – Hosni

0

如果你想有兩個具有相同的數量和類型的構造函數,你應該使用static factory method模式。做出這樣
public static HeyStatus constructFromArray1(byte[] bytes) {...}

public static HeyStatus constructFromArray2(byte[] bytes) {...}
方法(你應該名稱方法得當,不要使用我提出的名稱),將正確構造對象,那麼你就可以構建從代碼對象就像
HeyStatus heyStatus = HeyStatus.constructFromArray1(bytes) (中
代替HeyStatus heyStatus = new HeyStatus(bytes)
它做你想做什麼是最好的方式。

0

您可以通過添加額外的(例如)的int參數只使用一個構造函數指定的代碼塊來執行。大號IKE在此,您將有一個構造器,包含代碼的兩個街區,你需要:

public HeyStatus(byte[] bytes, int option){ 
switch (option){ 
case 1: { 
//you can place here the code you used in the first constructor 
break; 
} 
case 2:{ 
//you can place here the code you used in the second constructor 
break; 
} 
default: break; 
} 

而當你調用構造函數,將指定的參數列表的選項。 乾杯!

相關問題