Что именно делает «Статический» означает, когда я объявляю «глобальные» переменные в 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 
}

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

7
задан Hristo 14 September 2013 в 08:45
поделиться

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

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

9
ответ дан 6 December 2019 в 08:41
поделиться
learn what "static" actually means

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

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

public class Car{

    private int speed;

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

}

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

Car car = new Car(100);

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

4
ответ дан 6 December 2019 в 08:41
поделиться

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

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

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

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

Member m = new Member();
m.iNumVertices = 0;
4
ответ дан 6 December 2019 в 08:41
поделиться

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

1
ответ дан 6 December 2019 в 08:41
поделиться

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

1
ответ дан 6 December 2019 в 08:41
поделиться

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

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

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

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

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

0
ответ дан 6 December 2019 в 08:41
поделиться

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

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

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

2
ответ дан 6 December 2019 в 08:41
поделиться

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

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

0
ответ дан 6 December 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: