Что именно означает «статический» при объявлении «глобальных» переменных в Java? - PullRequest
7 голосов
/ 05 августа 2010

Я много раз сталкивался с этой проблемой и никогда не удосужился узнать, почему это происходит, и узнать, что на самом деле означает «статический». Я просто применил изменения, предложенные Eclipse, и пошел дальше.

public class Member {

 // Global Variables
 int iNumVertices;
 int iNumEdges;

 public static void main(String[] args) {

  // do stuff

  iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices

  // do more stuff

 } // main end 
}

Итак, затмение говорит мне сделать static int iNumVertices;, и я не знаю почему. Так что же такое «статический», как он используется, какова цель использования «статического» и почему он вызывает у меня эту проблему?

Ответы [ 8 ]

9 голосов
/ 05 августа 2010

Вот ваш пример:

public class Member {

    // Global Variables
    int iNumVertices;
    int iNumEdges;

    public static void main(String[] args) {

        // do stuff

        iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices

    }
}

Метод main является статическим методом, связанным с классом.Он не связан с экземпляром Member, поэтому он не может получить доступ к переменным, связанным с экземпляром Member.Решением этого является , а не , чтобы сделать эти поля статичными.Вместо этого вам нужно создать экземпляр Member, используя ключевое слово new.

Вот модифицированная версия:

public class Member {
    // Fields
    private int iNumVertices;
    private int iNumEdges;

    public Member(){
        // init the class
    }

    public static void main(String[] args) {
        Member member = new Member();
        member.iNumVertices = 0;
        // do more stuff
    }
}

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

4 голосов
/ 05 августа 2010
learn what "static" actually means

Что такое static на самом деле означает, что переменная Class будет одинаковой для всех экземпляров этого конкретного класса, однако, если вы хотите избежать использования статических переменных (что является хорошей идеей, поскольку статические переменные хранятся в памяти), выможет передавать конструктор через переменное значение, таким образом избегая использования статического модификатора, и достигать того же эффекта (то есть, если вы передаете то же значение при создании экземпляра класса).

Вот пример кода:

public class Car{

    private int speed;

    public Car(int speed){
        this.speed = speed;
    }

}

Таким образом, вы можете сделать это при создании нового экземпляра:

Car car = new Car(100);

и каждый раз, когда вы создаете экземпляр автомобиля, он будет иметь скорость 100, что позволяет избежать статического объявления private static int speed = 100;

4 голосов
/ 05 августа 2010

статические переменные являются общими для всех объектов класса.Здесь, в вашем примере, для каждого объекта Member , который вы создаете, вы получите объекты, которые имеют свои собственные значения iNumVertices .Когда вы используете static с переменной, для каждого объекта в Member используется только одна переменная.Методы static работают одинаково - они используются всеми объектами.

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

Нестатические переменные, такие как iNumVertices , принадлежат объекту класса.К ним нельзя получить доступ без создания объекта.Поэтому, когда вы обращаетесь к нестатической переменной из статического контекста (здесь метод main ), тогда java не будет знать, к какому объекту iNumVertices вы пытаетесь обратиться.Отсюда и ошибка.

Либо сделайте iNumVertices статическими, либо обратитесь к ней, создав объект Member

Member m = new Member();
m.iNumVertices = 0;
2 голосов
/ 05 августа 2010

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

Подробнее здесь:

http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

1 голос
/ 05 августа 2010

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

1 голос
/ 05 августа 2010

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

0 голосов
/ 05 августа 2010

Каждая переменная класса (переменная, объявленная в теле класса и вне тела метода), используемая в статическом методе, также должна быть объявлена ​​статической.

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

0 голосов
/ 05 августа 2010

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

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

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

За дополнительной информацией обращайтесь: http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

http://www.roseindia.net/java/beginners/staticvariable.shtml

...