Java返回子类的类型(抽象)
Java返回子类的类型(抽象),java,Java,我一直在努力编写一些基本的代码,但我完全被卡住了… 我有一个抽象类“Piece”: “典当”是指孩子: public class Pawn extends Piece { private static final int type = 1; } 现在来看问题:当使用Pawn p=new Pawn()创建典当时,p.getType()返回0,而不是1。 如何修复此问题?问题是您已经在抽象类中声明了一个变量。您不应该在子类中重新声明它。相反,将抽象类的变量设置为: 公共类典当扩展件{ 公
我一直在努力编写一些基本的代码,但我完全被卡住了…
我有一个抽象类“Piece”: “典当”是指孩子:
public class Pawn extends Piece {
private static final int type = 1;
}
现在来看问题:当使用
Pawn p=new Pawn()创建典当时
,p.getType()
返回0
,而不是1
。如何修复此问题?问题是您已经在抽象类中声明了一个变量。您不应该在子类中重新声明它。相反,将抽象类的变量设置为:
公共类典当扩展件{
公共典当{
类型=1;
}
}
您还应该将变量声明为受保护的
,这样子类就可以访问它,并且避免使它成为静态的
,因为这将只允许所有子类使用一个值:
公共抽象类片段{
保护int型;
公共int getType(){
返回类型;
}
}
这里有一种方法。但是你真的需要仔细阅读类和抽象类
公共抽象类片段{
公共int getType(){
返回0;
}
}
公共类典当扩展件{
公共int getType(){
返回1;
}
}
您编写的此代码依赖于实例,而不是静态上下文:
Pawn p = new Pawn();
p.getType();
静态final字段不是为子类继承而设计的
在子类中创建与父类同名的静态final字段也不允许重写它
1) 因此,对于类型
字段,应该使用实例字段,而不是静态字段
2) 如果要重写子类中getType()的行为,实际上甚至不需要使用字段。使用一种方法就足够了
在基类中:
public abstract class Piece {
public int getType() {
return 0;
}
}
在儿童班:
public class Pawn extends Piece {
@Override
public int getType() {
return 1;
}
}
在一个类中有一个静态变量意味着该类的所有实例共享相同的值。我认为那不是你的本意 此外,您还可以通过不重新定义
getType()
方法来利用继承的层次结构
以下是解决此问题的多种方法之一:
public abstract class Piece {
protected int type;
public int getType() {
return type;
}
}
public class Pawn extends Piece {
public Pawn() {
type = 1;
}
}
你的方法有两个问题 首先,Java不支持静态方法的继承。并不是说它不能支持这一点——它只是一种设计选择。这意味着调用
getType()
的类Piece
的任何方法调用Piece
类的getType()
实现,而不是对实际子类的getType()
的多态调用
第二个问题是,你正在重新发明轮子。Java具有丰富的反射功能:您可以使用和检查:
if(myObject instanceof Piece && myObject.getClass() != Piece.class) {
// do stuff
}
当然,您可以将其作为piece类的方法(无需重写)。我认为一个改进是将
getType
方法本身抽象为piece
,如public abstract int getType()代码>。这就使得编译器要求您为每个片段类型重新定义它,避免您忘记替换片段类型中的默认值。仅仅使用getType()方法可能不好,作者需要了解更多关于OOP的知识。是的,我是第一个,但这种情况经常发生。
if(myObject instanceof Piece && myObject.getClass() != Piece.class) {
// do stuff
}