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
}