如下所示,我有以下代码作为我的构造函数。但我想用不同的名字复制它。但我对此有误。我能以某种方式修改以符合要求吗?
这是原始代码:
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 :(得分: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;
}
当您调用构造函数时,您将在参数列表中指定该选项。 干杯!