Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将父类属性添加到子类_Java_Oop - Fatal编程技术网

Java 如何将父类属性添加到子类

Java 如何将父类属性添加到子类,java,oop,Java,Oop,我有一个名为Set的父类,代表一组网球比赛 public class Set { private String set1; private String set2; private String set3; //private Object[] match; public Set() { setSet1(set1); setSet2(set2); setSet3(set3); } public void setSet1(String set

我有一个名为
Set
的父类,代表一组网球比赛

public class Set {
  private String set1;
  private String set2;
  private String set3;
  //private Object[] match;

  public Set() {
    setSet1(set1);
    setSet2(set2);
    setSet3(set3);
  }

  public void setSet1(String set1) {
    this.set1 = set1;
  }

  public String getSet1() {
    return set1;
  }

  public void setSet2(String set2) {
    this.set2 = set2;
  }

  public String getSet2() {
    return set2;
  }

  public void setSet3(String set3) {
    this.set3 = set3;
  }

  public String getSet3() {
    return set3;
  }


  public String toString(){
    return String.format("set1: %s, set2: %s, set3: %s", set1, set2, set3);
  }


}
还有一个子类
Set
名为
SingleSet
,我试图将这些集合添加到一个名为“game”的数组中

public class SingleSet extends Set{
  private Object homePlayer;
  private Object awayPlayer;

  private String[] game;

  public SingleSet(Object homePlayer, Object awayPlayer){
    super();

    game = new String[3];

    game[0] = super.getSet1();
    game[1] = super.getSet2();
    game[2] = super.getSet3();

    setHomePlayer(homePlayer);
    setAwayPlayer(awayPlayer);
  }

  public void setHomePlayer(Object homePlayer) {
    this.homePlayer = homePlayer;
  }

  public Object getHomePlayer() {
    return homePlayer;
  }

  public void setAwayPlayer(Object awayPlayer) {
    this.awayPlayer = awayPlayer;
  }

  public Object getAwayPlayer() {
    return awayPlayer;
  }

  public void setGame(String[] game) {
    this.game = game;
  }

  public String[] getGame() {
    return game;
  }

  public String toString(){
    return String.format("Player: %s Vs. Player: %s, Single set game: %s, %s, %s", homePlayer, awayPlayer, game[0], game[1], game[2]);
  }
}
这就是我试图将父类中的
集添加到子类中的地方(这是针对FXML的,因此代码在我的控制器中):


打印结果时,数组值为空。我尝试单独打印它们,效果很好,因此我知道
set1Box.getText()
工作正常。

您应该重写set方法。而不是在构造函数实例化后在集合中

public SingleSet(对象homePlayer、对象awayPlayer){
超级();
游戏=新字符串[3];
//game[0]=super.getSet1();
//game[1]=super.getSet2();
//game[2]=super.getSet3();
setHomePlayer(homePlayer);
setAwayPlayer(awayPlayer);
}
@凌驾
公共无效集合1(字符串集合1){
this.game[0]=set1;
超级设置1(设置1);
}
@凌驾
公共无效集合2(字符串集合2){
this.game[1]=set2;
超级设定2(设定2);
}
@凌驾
公共无效集合3(字符串集合3){
this.game[2]=set3;
超级设定3(设定3);
}

打印时看到
null
值的原因是它们实际上是
null

SingleSet game1=新的SingleSet(homePlayer1Dropdown.getValue(),awayPlayer1Dropdown.getValue())
正在创建一个新的
单集
,它扩展了

SingleSet
构造函数调用Set构造函数

首次创建集合时,其所有值均为
null
。然后构造函数开始工作,但集合构造函数实际上什么都不做,所以集合的实例变量保持为空

十个单集继续使用给定的参数构建对象,这些参数对设置set1、set2、set3的值没有任何作用

 game1.setSet1(set1Box1.getText());
 game1.setSet2(set1Box2.getText());
 game1.setSet3(set1Box3.getText());
实际上,它们将一个值设置为set1、set2、set3(因为您是说set1Box1.getText()和其他函数正在工作)。那么,为什么打印时仍然看到空值呢

public String toString(){
  return String.format("Player: %s Vs. Player: %s, Single set game: %s, %s, %s", homePlayer, awayPlayer, game[0], game[1], game[2]);
}
这就是为什么:您正在打印游戏[0],诸如此类,它们实际上是空的,因为当您设置游戏数组时,这些值都是空的

public SingleSet(Object homePlayer, Object awayPlayer){
  super(); //setting null values to set1, set2, set3

  game = new String[3];

  game[0] = super.getSet1(); //this returns null!
  game[1] = super.getSet2(); //this returns null!
  game[2] = super.getSet3(); //this returns null!

  setHomePlayer(homePlayer);
  setAwayPlayer(awayPlayer);
}
生成对象时打印一些值,并将看到:)

要解决这个问题,一种方法是使用参数化构造函数
public Set(String set1,String set2,String set3)
,使用参数化子构造函数
public SingleSet(String set1,String set2,String set3,Object homePlayer,Object awayPlayer)
和对super,
super(set1,set2,set3)

然后你应该在创建游戏1时设置值
SingleSet game1=newsingleset(set1Box1.getText(),set1Box1.getText(),set1Box1.getText()homePlayer1Dropdown.getValue(),awayPlayer1Dropdown.getValue())

  • 您没有在Set的默认构造函数中设置任何内容
  • 应该为您的类找到一个更好的名称,因为“Set”与集合Set混淆
  • 对两个类都使用immutable以避免麻烦-删除所有setter并在构造函数中初始化

  • 我不太擅长网球计分规则,但就我所知,“一盘”有许多“比赛”,而“比赛”则由许多盘组成。这个关系的逻辑是什么“Set
    setSet1
    等等不在你的
    game
    数组中设置值。它们设置
    set1
    等等。让构造函数调用类设置器是不好的做法(如第一节课所示)将这些值传递到构造函数中。另外,我认为你对网球的理解还不够,网球比赛是由多个组组成的,每个组都是多个游戏的名称。你可能必须@Override toString方法。检查你的setter和数组。setter用于set1、set2、set3。你想打印游戏[0..2]构造函数用于设置实例变量的值。可以使用自己的设置器,这样您就可以拥有所有的逻辑(比如拒绝
    null
    值),但是您必须给构造函数提供一些参数,比如
    public set(String set1,String set2,String set3)
    。然后您还应该更改
    super()
    call。多次保存相同的数据(通常)也不太好-很难将它们全部同步。不需要
    game
    字段-如果需要数组,只需更改
    getGame
    方法来创建和填充数组。(
    public String[]getGame(){返回新字符串[]{getSet1(),getSet2(),getSet3()};}
    public SingleSet(Object homePlayer, Object awayPlayer){
      super(); //setting null values to set1, set2, set3
    
      game = new String[3];
    
      game[0] = super.getSet1(); //this returns null!
      game[1] = super.getSet2(); //this returns null!
      game[2] = super.getSet3(); //this returns null!
    
      setHomePlayer(homePlayer);
      setAwayPlayer(awayPlayer);
    }