【问题标题】:How to get and set names in an array of objects?如何在对象数组中获取和设置名称?
【发布时间】:2017-11-19 11:57:44
【问题描述】:

我有一个家庭作业,但我对 Java 很陌生,过去两天一直在尝试创建一个玩家对象数组,设置名称并获取名称。

但无论我尝试什么,都会出错。我看过很多教程并准确地复制了他们所做的,但它不起作用。如何正确创建数组并获取/设置名称?

我有一个 Game 类和一个 Player 类:

游戏类 -- 一个版本:

Player[] players = new Player[3];

//All the tutorials I've seen show both these types of putting names in:

players[0] = new Player(); 

//followed by:
players[0].setName("name");
//or...

players[0] = new Player("human"); 

 //my errors on both: unknown class 'players'... 
//unexpected token... invalid method... etc etc

Gmae 类 - 不同版本(使用方法):

//for the homework, I'm expected to put it all into a method
//ideally I'd be using the setName method from the Players class (below)
//but that doesn't work here

void createPlayers(Player[] players) { 
    for (Player p : players) {
        players[0] = new Player("human");
        players[1] = new Player("Greg");
        players[2] = new Player("Susan");
    }
}

public static void main(String[] args) {
Game obj = new Game();

//I had to change Players[] to static to get a printout but it's not supposed 
//to be static

 //I tried these separately to check output
//I need to be able to get the name of a player

    obj.createPlayers(players); //no output 

    for (Player pl : players) {
        System.out.println("Name = " + pl); //null null null
    }
    System.out.println(obj.players[0]); //null
    obj.player[0].getName(); //cannot resolve symbol 'player'
}

Game Class -- 另一个版本(将所有内容放在 main 中):

public static void main(String args[]) {
    Main game = new Main();

    Player p0 = new Player("Jeff"); //it errored if I didn't put a name
    Player p1 = new Player("Susan"); //but I need to be able to change names
    Player p2 = new Player("Michael");

    Player[] players = new Player[3];
    players[0] = p0;
    players[1] = p1;
    players[2] = p2;

    p2.setPName("Alan");
    System.out.println(p2.getPName()); //output: null

Player 类:具有 getter 和 setter 功能,理想情况下我会使用它们来获取和设置玩家名称,但我不知道如何使它们在我的 Game 类中工作。

private String name;

Player (String name) { this.name = name; }

public void setName(String name) { this.name = name;  }

public String getName() { return name; }

【问题讨论】:

  • 您实际使用的版本在哪里?并放置完整的错误堆栈跟踪
  • 为什么 setter 的名字是 setName 定义的却叫 setPName。看起来你混淆了几个教程中的代码。

标签: java arrays class object getter-setter


【解决方案1】:

对你的 Game 类的一个简单修改给了我这个,它几乎可以满足你想要做的事情:

public class Game {

        void createPlayers(Player[] players) {
            Player player1 = new Player();
            player1.setName("human");

            Player player2 = new Player();
            player2.setName("Greg");

            Player player3 = new Player();
            player3.setName("Susan");

            players[0] = player1;
            players[1] = player2;
            players[2] = player3;
        }

        public static void main(String[] args) {
            Player[] players = new Player[3];

            Game obj = new Game();
            obj.createPlayers(players);

            for (Player pl : players) {
                System.out.println("Name = " + pl.getName());
            }
        }
    }

【讨论】:

  • 太棒了!这对我来说非常清晰易懂,而且很有效。非常感谢。
【解决方案2】:

1) 用于您的游戏类——一个版本

players[0] = new Player(); 

将不起作用,因为您的类 Player 中没有任何默认构造函数。 您可以添加默认构造函数,您的类将如下所示。

private String name;

Player () {}

Player (String name) { this.name = name; }

public void setName(String name) { this.name = name;  }

public String getName() { return name; }

2) 对于您的游戏类 -- 不同的版本 在您的主类中,您还没有创建玩家列表,并且没有创建列表,您将在方法中传递它。

在你的主课之前

obj.createPlayers(players);

添加Player[] players = new Player[3];

3) 对于你的游戏类——另一个版本 输出为空,因为 System.out.println(p2.getPName()); 您正在尝试执行 p2.getPName() 但在您的类 Player 中,getter 是 getName()。改成它就行了。

【讨论】:

  • 感谢您对默认构造函数的建议,我没有意识到我错过了。
【解决方案3】:
//Player Class  . Create a package named test and create a class

package test;

public class Player {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

 //Create a Game class in same package 

 package test;

 public class Game {
 //Game Name is just name of the game
 private String gameName;
 private Player[] players;
 public String getGameName() {
 return gameName;
 }
 public void setGameName(String gameName) {
 this.gameName = gameName;
 }
 public Player[] getPlayers() {
 return players;
 }
 public void setPlayers(Player[] players) {
 this.players = players;
 }

 }

 //Create a Test class in same package which contains main method 

  package test;

  public class Test {
  public static void main(String[] args) {

  Game game =new Game();

  Player []players = new Player[3];

  players[0]= new Player(); //Create Player Object and assign it into 
  player[0]
  players[0].setName("name1");

  players[1] = new Player();
  players[1].setName("name2");

  players[2] = new Player();
  players[2].setName("name3");

  game.setPlayers(players);

  for(Player player : game.getPlayers()){
    System.out.println(player.getName());
     }
   }
 }

【讨论】:

    【解决方案4】:

    在第一个清单中,您创建没有名称的新玩家是错误的,因为在禁用参数默认构造函数的类中定义新构造函数后,您需要添加默认构造函数或创建有名称的玩家。

    Player[] players = new Player[3];

    //我见过的所有教程都显示了这两种类型的推杆名称 在:

    players[0] = new Player();

    您的代码的另一部分也包含错误,您将一个 getter 和 setter 方法名称放在 Player 类中,但尝试将它们与其他名称一起使用。

    class Player {
      private String name;
    
      Player (String name) { this.name = name; }
    
      public void setName(String name) { this.name = name;  }
    
      public String getName() { return name; }
    }
    
        p2.setPName("Alan");
        System.out.println(p2.getPName()); <--this method is not exists
    

    正确的代码是这样的,但要注意这是糟糕的设计:

    public class Main {
    
            public static void main(String...args) {
                Game game = new Game();
                Player[] players = game.getPlayers();
                for(Player player : players) {
                    System.out.println(player.getName());
                }
                for(int i = 0; i < players.length; i++) {
                    players[i].setName("new name");
                }
                for(Player player : players) {
                    System.out.println(player.getName());
                }
            }
    
    }
    
    class Player {
        private String name;
    
        public Player(String name) { this.name = name; }
    
        public void setName(String name) { this.name = name; }
    
        public String getName() { return name; }
    }
    
    class Game {
        private Player[] players;
    
        public Game() {
            players = { new Player("human"), new Player("Greg"), new Player("Susan") };
        }
    
       public Player[] getPlayers() {
            return players;
       }
    }
    

    将此代码放在具有 Main.java 名称的文件中,并放在控制台中的同一文件夹中 javac Main.java 然后用 java Main 命令启动你的程序

    输出将是:

    human
    Greg
    Susan
    new name
    new name
    new name
    

    【讨论】:

    • 感谢您的时间和帮助。我现在对此理解得更好了。
    【解决方案5】:
    1. 您似乎没有默认构造函数。因此,您需要将名称传递给构造函数。这是您第一次尝试时遇到未定义方法错误的原因。
    2. 第二个播放器未在本地范围内声明。只需在 main 方法中声明 Player[] 就可以了。
    3. Third 看起来不错,只是方法 getPName 未定义或其值为 null。由于您没有提供这部分代码,我无法对此发表进一步评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多