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";
    }
4

7 回答 7

3

这是一个方法重载的问题(构造函数是一种特殊的方法)。
简而言之,您只能通过名称和参数类型来区分两种方法。

您不能声明多个具有相同名称和相同数量和类型的参数的方法,因为编译器无法区分它们。

于 2013-05-31T07:48:23.093 回答
0
public HeyStatus(byte[] bytes)
public HeyStatus(byte[] bytes2)

两者都是相同的声明。您需要更改 parameter( byte[]) 的类型以重载构造函数。构造函数或方法重载基于签名的差异。在这里,您对两个构造函数定义使用相同的签名,只是更改了参数名称,这是无效的。

阅读Javadoc了解更多信息。

Java 编程语言支持重载方法,Java 可以区分具有不同方法签名的方法。这意味着如果类中的方法具有不同的参数列表,则它们可以具有相同的名称

于 2013-05-31T07:45:33.797 回答
0

您可以通过添加额外的(例如)int 参数来指定要执行的代码块,从而仅使用一个构造函数。像这样,您将拥有一个构造函数,其中包含您需要的两个代码块:

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;
}

当您调用构造函数时,您将在参数列表中指定选项。干杯!

于 2013-05-31T09:05:47.333 回答
0

如果你想拥有两个具有相同参数计数和类型的构造函数,你应该使用static factory method模式。制作像
public static HeyStatus constructFromArray1(byte[] bytes) {...}
and之类的方法
public static HeyStatus constructFromArray2(byte[] bytes) {...}
(你应该正确命名这些方法,不要使用我建议的名称),这将正确构造对象,然后你可以从代码中构造对象
HeyStatus heyStatus = HeyStatus.constructFromArray1(bytes)
(而不是HeyStatus heyStatus = new HeyStatus(bytes).
这是做你想做的最好的方法.

于 2013-05-31T08:47:15.357 回答
0

在同一个类中不能有两个具有相同签名的方法。这也适用于构造函数。如果您执行以下操作,编译器将无法知道您调用的是哪一个:

byte[] bytes = new bytes[]{1, 2, 3};
new HeyStatus(bytes);
于 2013-05-31T07:48:38.293 回答
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);

但只有一个承包商。

PS如果你想在其中使用更多的构造函数参数必须不同于第一个,类型(不是名称)和/或数字。您可以通过谷歌搜索重载构造函数来获取更多信息。

编辑:

刚刚注意到与 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);
于 2013-05-31T08:14:57.397 回答
0

您没有更改构造函数签名。两个构造函数都具有相同的类型:

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

如果您提供不同类型的参数、不同数量的参数或两者,您可以定义多个具有相同名称的构造函数。它正在调用Constructor Overloaing

于 2013-05-31T07:46:38.557 回答