Изменить переменные объекта без изменения предыдущих экземпляров? - PullRequest
0 голосов
/ 27 февраля 2020

Я пишу программу для колоды карт и экспериментирую с объектом card, который содержит 3 переменные: rank, value и suit.

Я сделал объект карты и дал ему значение 3 червей. (suit = Hearts, Rank = Three, value = 3). и добавьте его в список с именем cards.

. Затем я изменю значения предыдущего объекта карты на 4 Червы. (suit = Hearts, Rank = Four, value = 4) и добавьте это в список cards.

Однако, когда я печатаю значения deck[0], (3 из сердец) и deck[1] (4 из сердец), мой вывод это: [Hearts, Four, 4] [Hearts, Four, 4]

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

Есть ли способ, которым я мог бы как-то «отключить» объект, который я поместил в список, от объекта, который я изменяю? Я серьезно не хочу делать 52 объекта для всех карт.

Мой код:

Объект карты :

class Card
{
    private static String suit;
    private static String rank;
    private static int value;

    public Card() {

    }

    public Card(String s, String r, int v) {
        suit = s;
        rank = r;
        value = v;
    }

    public static void setValues(String s, String r, int v) {
        suit = s;
        rank = r;
        value = v;
    }

    public static void toString(Card card) {
        System.out.println("[" + card.suit + ", " + card.rank + ", " + card.value + "]");
    }

}

Основной код:

    public void test() {
        Card card = new Card("Hearts", "Three", 3); //Making 3 of Hearts
        cards[0] = card;                            //Assigning to slot 0 in cards

        Card.setValues("Hearts", "Four", 4);        //Changing values to 4 of Hearts
        cards[1]= card;                             //Assigning to slot 1 in cards

        Card.toString(cards[0]);                    
        Card.toString(cards[1]);
    }
}

быстрое редактирование: изменение "Card.setValues" на "card.setValues" мало что сделал, но я подумал, что дам вам знать

1 Ответ

0 голосов
/ 27 февраля 2020

Я думаю, что вы неправильно поняли некоторые базовые c понятия здесь.

Если вы объявите атрибут как static, он станет атрибутом класса, что означает, что он доступен для всех объектов типа карты и всегда содержит одинаковое значение для этих объектов. Вместо этого, если вы удалите модификатор stati c, значение будет уникальным для каждого экземпляра объекта. Та же концепция применима к методам stati c.

Если вы повторно используете один и тот же экземпляр карты (как вы и собираетесь делать), вы всегда будете менять значение всех карт в массиве, потому что в основном вы просто добавили одну и ту же карту несколько раз, а затем изменили ее значение. Это происходит потому, что, присваивая cards[1]= card;, вы создаете ссылку на объект карты, а не ее копию.

В связи с этим невозможно создать объект для каждой карты.

Вероятно, вам следует посмотреть некоторые учебники о OOP (объектно-ориентированное программирование) в Java.

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