我一直在尝试使用一些基本代码,而且我完全被卡住了......
我有一个抽象的课程" Piece":
public abstract class Piece {
private static int type;
public int getType() {
return type;
}
}
" Pawn"是孩子:
public class Pawn extends Piece {
private static final int type = 1;
}
现在针对问题:在使用Pawn p = new Pawn();
创建Pawn时,p.getType()
会返回0
,而不是1
...
我该如何解决这个问题?
答案 0 :(得分:1)
问题是你已经在抽象类中声明了一个变量。您不应该在子类中重新声明它。相反,设置抽象类的变量如下:
public class Pawn extends Piece {
public Pawn() {
type = 1;
}
}
您还应该将变量声明为protected
,以便子类可以访问它并避免使其成为static
,因为这将只允许所有子类的一个值:
public abstract class Piece {
protected int type;
public int getType() {
return type;
}
}
答案 1 :(得分:1)
这是一种方法。但是你真的需要阅读类和抽象类。
public abstract class Piece {
public int getType() {
return 0;
}
}
public class Pawn extends Piece {
public int getType() {
return 1;
}
}
答案 2 :(得分:1)
您编写的此代码依赖于实例,而不是静态上下文:
Pawn p = new Pawn();
p.getType();
静态final字段的设计不是由子类继承的。
在子类中创建一个静态final字段,其名称与父类相同,并不允许覆盖它。
1)因此,您应该为type
字段使用实例字段而不是静态字段。
2)如果你想覆盖子类中getType()的行为,实际上你甚至不需要使用字段。使用方法就足够了。
在基类中:
public abstract class Piece {
public int getType() {
return 0;
}
}
在儿童班:
public class Pawn extends Piece {
@Override
public int getType() {
return 1;
}
}
答案 3 :(得分:0)
在类中包含静态变量意味着该类的所有实例共享相同的值。我不认为这是你想要的。
此外,您可以通过不重新定义getType()
方法来使用继承层次结构。
以下是解决问题的众多方法之一:
public abstract class Piece {
protected int type;
public int getType() {
return type;
}
}
public class Pawn extends Piece {
public Pawn() {
type = 1;
}
}
答案 4 :(得分:0)
您的方法存在两个问题。
首先,Java不支持静态方法的继承。并不是说它不能支持这个 - 它只是一个设计选择。这意味着任何调用 <wd:EFW2_Year_End_Worker_Filing_Data>
<wd:Employee_First_Name>Allison</wd:Employee_First_Name>
<wd:EFW2_Year_End_Worker_Box_Data>
<wd:Box_Description>Federal income tax withheld</wd:Box_Description>
<wd:Amount>1030.84</wd:Amount>
</wd:EFW2_Year_End_Worker_Box_Data>
<wd:EFW2_Year_End_Worker_Box_Data>
<wd:Box_Description>Social security wages</wd:Box_Description>
<wd:Amount>7156.25</wd:Amount>
</wd:EFW2_Year_End_Worker_Box_Data>
<wd:EFW2_Year_End_Worker_Box_Data>
<wd:Box_Description>Social security tax withheld</wd:Box_Description>
<wd:Amount>443.69</wd:Amount>
</wd:EFW2_Year_End_Worker_Box_Data>
<wd:EFW2_Year_End_Worker_Box_Data>
<wd:Box_Description>Medicare wages and tips</wd:Box_Description>
<wd:Amount>7156.25</wd:Amount>
</wd:EFW2_Year_End_Worker_Box_Data>
<wd:EFW2_Year_End_Worker_Box_Data>
<wd:Box_Description>Medicare tax withheld</wd:Box_Description>
<wd:Amount>103.77</wd:Amount>
</wd:EFW2_Year_End_Worker_Box_Data>
<wd:EFW2_Deferred_and_Other_Compensation_Data>
<wd:Code>DD</wd:Code>
<wd:Amount>4513.28</wd:Amount>
</wd:EFW2_Deferred_and_Other_Compensation_Data>
</wd:EFW2_Year_End_Worker_Filing_Data>
的类Piece
的方法都会调用getType()
的{{1}}类'实现,而不是对Piece
的多态调用无论实际的子类是什么。
第二个问题是你有点重新发明轮子。 Java具有丰富的反射功能:您可以使用getClass()和instanceof
进行检查:
getType()
当然你可以把它作为一个类的方法(不需要覆盖它)。