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并在构造函数中初始化
我不太擅长网球计分规则,但就我所知,“一盘”有许多“比赛”,而“比赛”则由许多盘组成。这个关系的逻辑是什么“SetsetSet1
等等不在你的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);
}