具有不同参数的相同构造函数

时间:2013-05-31 07:43:20

标签: android constructor

如下所示,我有以下代码作为我的构造函数。但我想用不同的名字复制它。但我对此有误。我能以某种方式修改以符合要求吗?

这是原始代码:

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

7 个答案:

答案 0 :(得分:3)

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

  

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

答案 1 :(得分:0)

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

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

阅读Javadoc了解更多信息。

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

只需使用一个构造函数,当你调用它时,在参数中放入相应的bytes数组就是一个简化的例子:

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

编辑:

注意到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);

答案 5 :(得分: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) 这是做你想做的最好的方式。

答案 6 :(得分: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;
}

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