Java返回类型的Child类(摘要)

时间:2017-02-02 21:44:40

标签: java


我一直在尝试使用一些基本代码,而且我完全被卡住了......

我有一个抽象的课程" 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 ...
我该如何解决这个问题?

5 个答案:

答案 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()

当然你可以把它作为一个类的方法(不需要覆盖它)。