Переменные объекта против переменных класса в Java - PullRequest
12 голосов
/ 24 декабря 2011

Я нахожусь в процессе изучения Java, и я не понимаю разницу между переменными объекта и переменной класса. Все, что я знаю, это то, что для того, чтобы это была переменная класса, вы должны сначала объявить ее с помощью статического оператора. Спасибо!

Ответы [ 5 ]

15 голосов
/ 24 декабря 2011

В Java (и в ООП в целом) объекты имеют два вида полей (переменные).

Переменные экземпляра (или переменная объекта) - это поля, которые принадлежат конкретному экземпляру объекта.

Статические переменные (или переменные класса) являются общими для всех экземпляров одного и того же класса.

Вот пример:

public class Foobar{
    static int counter = 0 ; //static variable..all instances of Foobar will share the same counter and will change if such is done
    public int id; //instance variable. Each instance has its own id
    public Foobar(){
        this.id = counter++;
    }
}

использование:

Foobar obj1 = new Foobar();
Foobar obj2 = new Foobar();
System.out.println("obj1 id : " + obj1.id + " obj2.id "+ obj2.id + " id count " + Foobar.counter);
3 голосов
/ 24 декабря 2011

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

public class JellyBean{

    // instance variables every jellyBean object will have its own 
    // variable for color
    String color;

    // static variable only one copy of this variable exists for 
    // all jellyBean objects.
    static int totalNumberOfJellyBeans;

}//end class 

Если вы создали 2 объекта желе, у вас будет две переменные для цвета, потому что у каждого желе есть своя переменная для цвета.И 1 переменная для totalNumberOfJellyBeans, потому что оба объекта jellyBean используют эту переменную одного класса.

2 голосов
/ 28 октября 2014

Допустим, у вас есть проект автомобиля с именем ToyotaYaris, в котором у вас может быть переменная с именем maxSpeed. Все автомобили, созданные с этим планом (его экземплярами), будут иметь одинаковую максимальную скорость, поэтому переменная должна принадлежать проекту, а не отдельным автомобилям. Если maxSpeed изменится в чертеже, то изменится и во всех автомобилях, которые он производит.

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

Таким образом:

class ToyotaYaris {
    static int maxSpeed;
    int speed;
}
2 голосов
/ 24 декабря 2011

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

class Muffin {

    private static final int calories = 9320;

    public String flavor;

    public Muffin( String flavor ){
        this.flavor = flavor;
    }

}

В этом классе calories является переменной класса. В любом другом фрагменте кода вы можете получить количество калорий в любом виде сдобы, позвонив по номеру Muffin.calories. В этом случае ключевое слово final также используется, чтобы сделать число калорий постоянным.

В том же классе у нас есть переменная объекта, flavor. Это зависит от экземпляра класса и устанавливается в конструкторе.

Muffin myMuffin = new Muffin( "blueberry" );

Так что теперь вы можете получить доступ к вкусу этого кекса, позвонив по номеру myMuffin.flavor. Обратите внимание, как нам нужно создать экземпляр Muffin объекта, прежде чем мы сможем получить доступ к его flavor.

Изменение статических (классовых) переменных

Приведенный выше пример немного натянут, поскольку разные типы кексов будут иметь разное количество калорий. Они полезны для констант, но вот случай, когда значение статической переменной изменяется:

class Muffin {

    private static int next_id = 1;

    public int id;
    public String flavor;

    public Muffin( String flavor ){
        this.flavor = flavor;
        id = next_id++;
    }

}

Во втором примере нам нужно иметь уникальный идентификационный номер для каждого кекса, который мы создаем, чтобы у нас была статическая переменная, которая увеличивается каждый раз, когда создается экземпляр Muffin. Ключевое слово static делает значение next_id постоянным при каждом вызове конструктора, поэтому id будет отличаться и будет увеличиваться для каждого нового кекса.

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

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

...