Совместное использование атрибутов класса в Java - PullRequest
1 голос
/ 26 августа 2011

Давайте рассмотрим этот пример:

public class Shared {

    private int attribute;

    public Shared() {}

    public void incrementAttribute(int i) {
            attribute += i;
    }

    public int getAttribute() {
            return attribute;
    }

    public static void main(String[] args) {
            Shared s1 = new Shared();
            Shared s2 = new Shared();

            s1.incrementAttribute(1);
            s2.incrementAttribute(1);

            s1.getAttribute();
            s2.getAttribute();
    }    
}

Как я могу изменить этот класс, чтобы иметь 1 2 на выходе при вызове getAttribute(), а не 1 1

Что-то вроде глобальной переменной, я попробовал ключевое слово final, но не могу установить что-либо с помощью метода.

Ответы [ 5 ]

5 голосов
/ 26 августа 2011

Вам нужно сделать атрибут static.

private static int attribute;
        ^^^^^^

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


Также для вывода 1 2 необходимо изменить

s1.incrementAttribue(1);
s2.incrementAttribue(1);

System.out.println(s1.getAttribute());
System.out.println(s2.getAttribute());

до

s1.incrementAttribue(1);
System.out.println(s1.getAttribute());

s2.incrementAttribue(1);
System.out.println(s2.getAttribute());

демонстрация ideone.com

2 голосов
/ 26 августа 2011

Сделать атрибут переменной static.

1 голос
/ 26 августа 2011

Если вы сделаете переменную static, она будет использоваться всеми экземплярами класса, что вам и требуется в вашем примере. Чтобы пояснить, какое ключевое слово final вы пытались использовать, ключевое слово final используется для обозначения переменной, которая может быть инициализирована только один раз. Для переменной члена класса, такой как та, которую вы определили выше:

private int attribute;

он должен инициализироваться либо при объявлении, либо внутри конструктора класса - вот почему вы не смогли присвоить ему значение из метода.

1 голос
/ 26 августа 2011

Вы фактически намекали на решение с названием вопроса Совместное использование class атрибутов в Java".

В вашем примере attribute является переменной экземпляра, котораяозначает, что каждый экземпляр вашего Shared класса (s1 и s2) получает собственную копию переменной, и они обновляются независимо.

Вам нужна переменная класса, то есть что-то общеево всех экземплярах класса.В Java это также называется статической переменной.Добавьте ключевое слово static к объявлению переменной attribute, чтобы изменить его с переменной экземпляра на переменную класса:

public class Shared {
  private static int attribute;

  public Shared() {}

  public void incrementAttribute(int i) {
    attribute += i;
  }

  public int getAttribute() {
    return attribute;
  }

  public static void main(String[] args) {
    Shared s1 = new Shared();
    Shared s2 = new Shared();
    s1.incrementAttribute(1);
    System.out.println(s1.getAttribute());
    s2.incrementAttribute(1);
    System.out.println(s2.getAttribute());
  }
}

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

0 голосов
/ 26 августа 2011

Поскольку ваш атрибут является полем экземпляра, у каждого создаваемого вами объекта будет экземпляр поля атрибута. Поэтому, когда вы создаете 2 объекта s1 и s2, они оба имеют отдельные поля атрибутов.

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

...