如何在对象数组中获取和设置名称?

How to get and set names in an array of objects?

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

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

我有一个游戏 class 和一个玩家 class:

游戏class -- 一个版本:

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 class - 不同版本(使用方法):

//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'
}

游戏Class -- 另一个版本(将所有内容放在主版本中):

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 class:具有 getter 和 setter 功能,我理想情况下会使用它们来获取和设置玩家名称,但我不知道如何让它们在我的游戏中工作 class。

private String name;

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

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

public String getName() { return name; }

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

Player[] players = new Player[3];

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

players[0] = new Player();<-- wrong! because you don't have this` constructor in Player class

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

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
  1. 您似乎没有默认构造函数。所以你需要将名称传递给构造函数。这是您第一次尝试时出现未定义方法错误的原因。
  2. 第二次,玩家没有在本地范围内声明。只要在main方法中声明Player[]就可以了。
  3. 第三个看起来不错,除了方法 getPName 没有定义或者它的值为空。由于您没有提供这部分代码,因此我无法对此进行进一步评论。
//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());
     }
   }
 }

对您的游戏进行简单修改 class 给了我这个,它几乎可以满足您的要求:

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());
            }
        }
    }

1) 对于您的游戏 class -- 一个版本

players[0] = new Player(); 

将无法工作,因为您的 class 播放器中没有任何默认构造函数。 您可以添加默认构造函数,您的 class 将如下所示。

private String name;

Player () {}

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

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

public String getName() { return name; }

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

在你的主要class之前

obj.createPlayers(players);

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

3) 对于您的游戏 Class -- 另一个版本 输出为空,因为 System.out.println(p2.getPName()); 你正在尝试做 p2.getPName() 但在你的 class 播放器中 getter 是 getName()。改一下就行了