Статические переменные vs Instance: разница?

в чем разница между статической и переменной экземпляра. Следующее предложение-это то, что я не могу получить:

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

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

8 ответов


в контексте атрибутов класса, static имеет другое значение. Если у вас есть поле, как:

private static int sharedAttribute;

затем, каждый экземпляр из класса поделится тот же переменная, так что если вы измените ее в одном экземпляре, изменение отразится во всех экземплярах, созданных до или после изменения.

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

  1. константы класса: так как они являются const, наличие доступа ко всем классам к одному и тому же значению не повредит, потому что никто не может это изменить. Они могут сохранить память, если у вас есть большое экземпляров этого класса. Не уверен одновременно хотя доступа.
  2. переменные предназначены для совместного использования, например, reference counters & co.

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

A static метод может только доступ static атрибуты, но подумайте дважды, прежде чем пытаться это.

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


скажем, есть тестовый класс:

class Test{
public static int a = 5;
public int b = 10;
}
// here t1 and t2 will have a separate copy of b
// while they will have same copy of a.
Test t1 = new test(); 
Test t2 = new test();

вы можете получить доступ к статической переменной с именем класса, как это

Test.a = 1//some value But you can not access instance variable like this
System.out.println(t1.a);
System.out.println(t2.a);

в обоих случаях вывод будет 1 как общий ресурс для всех экземпляров тестового класса. в то время как переменная экземпляра будет иметь отдельную копию B (переменная экземпляра) Так что

 t1.b = 15 // will not be reflected in t2.
 System.out.println(t1.b); // this will print 15
 System.out.println(t2.b); / this will still print 10; 

надеюсь, что это объясняет ваш запрос.


переменные:

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

public class Product {
    public int barcode;
}

переменные класса:

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

public class Product {
    public static int barcode;
}

полный пример:

переменные:

public class Main {
    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.barcode = 123456;

        Product prod2 = new Product();
        prod2.barcode = 987654;

        System.out.println(prod1.barcode);
        System.out.println(prod2.barcode);
    }
}

public class Product {
    public int barcode;
}

выход будет:

123456
987654

теперь измените переменную экземпляра на переменную класса, сделав ее статической:

переменные класса:

public class Main {
    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.setBarcode(123456);
        Product prod2 = new Product();
        prod2.setBarcode(987654);

        System.out.println(prod1.getBarcode());
        System.out.println(prod2.getBarcode());
    }
}

public class Product {
    public static int barcode;

    public int getBarcode() {
        return barcode;
    }

    public void setBarcode(int value){
        barcode = value;
    }
}

Я нестатические методы, чтобы получить и установить значение штрих-кода, чтобы иметь возможность вызывать его из объекта, а не из класса.
Вывод будет следующим:

987654
987654


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


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


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


Я думаю, вы думаете об определении C / C++ ключевого слова static. Здесь ключевое слово static имеет много применений. В Java функциональность статического ключевого слова описана в вашем сообщении. Во всяком случае, вы можете попробовать это для себя:

public class Test_Static{
    static int x;
    public static void main(String[] argv){
        Test_Static a = new Test_Static();
        Test_Static b = new Test_Static();
        a.x = 1; // This will give an error, but still compile.
        b.x = 2;
        System.out.println(a.x); // Should print 2
    }
}

и аналогично для статических переменных:

public class Test_NonStatic{
     int x;
     public static void main(String [] argv){
         Test_NonStatic a = new Test_NonStatic();
         Test_NonStatic b = new Test_NonStatic();
         a.x = 1;
         b.x = 2;
         System.out.println(a.x); // Should print 1.
     }
}

рассмотрим класс MyClass, имея один статический и один нестатический член:

public class MyClass {
    public static int STATICVARIABLE = 0;
    public int nonStaticVariable = 0;
}

теперь, давайте создадим main() создать пару экземпляров:

public class AnotherClass{  
    public static void main(String[] args) {    
        // Create two instances of MyClass
        MyClass obj1  = new MyClass();
        MyClass obj2  = new MyClass();
        obj1.nonStaticVariable = 30;  // Setting value for nonstatic varibale
        obj1.STATICVARIABLE = 40; //Setting value for static variable       
        obj2.nonStaticVariable = 50;
        obj2.STATICVARIABLE = 60;

        // Print the values actually set for static and non-static variables.
        System.out.println(obj1.STATICVARIABLE);
        System.out.println(obj1.nonStaticVariable);
        System.out.println(obj2.STATICVARIABLE);
        System.out.println(obj2.nonStaticVariable);
    }
}

результат:

60
30
60
50

теперь вы можете увидеть значение статической переменной printed 60 оба раза, как оба obj1 и obj2 ссылались на ту же переменную. С нестатической переменной выходы отличаются, так как каждый объект при создании сохраняет свою собственную копию нестатической переменная; внесенные в них изменения не влияют на другую копию переменной, созданную другим объектом.