Java ссылки на экземпляры объектов в разных классах - PullRequest
1 голос
/ 28 декабря 2011

У меня есть три разных класса, которые все должны использовать экземпляры одного класса. Этот один класс также может создавать несколько своих экземпляров, таких как player1, player2 и т. Д., И static не будет работать для этого, потому что в конечном итоге оно будет перезаписывать старое имя.

Я знаю, что я не должен использовать ключевое слово "new" в последнем классе, но я не знаю другого способа обойти это.

public class Test{
    public static void main(String[] args){
        Player player1 = new Player("bob");
        Player player2 = new Player("Hank");
        System.out.println("Original Name: " + player1.getName());
        System.out.println("Original Name 2: " + player2.getName());
        Display dis = new Display();
        dis.disp();

        System.out.println("Changed Name: " + player1.getName());
        System.out.println("Changed Name 2: " + player2.getName());
    }
}

class Player{
    private String pName = "";
    public Player(){}
    public Player(String name){
        pName = name;
    }

    public void setName(String inName){
        pName = inName;
    }

    public String getName(){
        return pName;
    }
}

class Display{
    public void disp(){
        Player player1 = new Player(), player2 = new Player(); //Unneeded
        System.out.println("Player name: " + player1.getName());
        System.out.println("Player name 2: " + player2.getName());

        player1.setName("Joe?");
        player2.setName("Billy?");

        System.out.println("Player new name: " + player1.getName());
        System.out.println("Player new name 2: " + player2.getName());
    }
}

Ответы [ 3 ]

4 голосов
/ 28 декабря 2011

Дайте классу Display два приватных поля Player и открытые методы, которые позволяют внешним классам взаимодействовать с игроками в случае необходимости, включая изменение имен, если это требуется.Вы можете указать класс setPlayer1(Player p) и setPlayer2(Player p) методы и / или позволить классу принимать двух игроков через параметры конструктора.

Что бы вы ни делали, вы вправе избегать использования статических переменных, если у вас очень веская причина для этого.

4 голосов
/ 28 декабря 2011

Кажется, вы пытаетесь изменить в Display тот же экземпляр Player, который вы создали в Test.Если это действительно так, вы должны передать эти объекты в disp():

public void disp(Player player1, Player player2){
     System.out.println("Player name: " + player1.getName());
     System.out.println("Player name 2: " + player2.getName());

     player1.setName("Joe?");
     player2.setName("Billy?");

     System.out.println("Player new name: " + player1.getName());
     System.out.println("Player new name 2: " + player2.getName());
}

, вызывая метод: dis.disp(player1,player2);

Я должен указать, что есть некоторый запах кодаздесь, но это похоже на учебную программу, так что если это так, вам не следует слишком беспокоиться об этом на данном этапе.

0 голосов
/ 28 декабря 2011

Ну, почему бы вам не сделать класс:

class Display{
    public static void disp(Player player, String newName){
        System.out.println("Player name: " + player.getName());

        player.setName(newName);

        System.out.println("Player new name: " + player.getName());
    }
}

и позвонить:

Display.disp(player1, "Joe?");
Display.disp(player2, "Hank?");

в тестовом классе

, так что, в основном, простостатический метод в Display и в качестве параметра поместите соответствующие поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...