it-swarm.com.ru

Переменные объекта против переменных класса в Java

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

11
foobar5512

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

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

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

Вот пример:

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);
14
Heisenbug

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

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 используют эту переменную одного класса.

3
gluestick

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

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

Следовательно:

class ToyotaYaris {
    static int maxSpeed;
    int speed;
}
2
Smig

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

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 будет отличаться и будет увеличиваться для каждого нового кекса.

2
derekerdmann

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

0
bobbymcr