Что именно означает "статический" при объявлении "глобальных" переменных в Java?

Я много раз сталкивался с этой проблемой и никогда не удосужился узнать, почему она происходит, и узнать, что на самом деле означает "статический". Я просто применил изменения, предложенные 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 ответов

Решение

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

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
    }
}

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

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;

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

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

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

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

Member m = new Member();
m.iNumVertices = 0;

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

Больше здесь:

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам