2010-07-31 6 views
7

Можем ли мы объявить Static Переменные внутри Main метод? Потому что я получаю сообщение об ошибке:Как объявить статическую переменную внутри метода Main?

Illegal Start of Expression 
+1

Вставьте соответствующий код. –

+2

Если, как утверждают некоторые комментаторы, ваш вопрос вдохновлен тем фактом, что вы * можете * сделать это на C, тогда вы должны указать, что в вашем вопросе, чтобы ответы могли помочь вам, указав различия между Java и C. – MatrixFrog

+0

Возможно, мы сможем ответить лучше, если узнаем, почему вам нужно использовать статическую переменную внутри метода? Все переменные, объявленные внутри метода, предназначены только для этого метода.Дайте нам знать, какую проблему вы пытаетесь решить, и я уверен, что мы можем придумать для вас хорошие ответы. – CoolBeans

ответ

26

Очевидно, нет, мы не можем.

В Java static означает, что это переменная/метод класса, она относится ко всему классу, но не к одному из его определенных объектов.

Это означает, что ключевое слово static может использоваться только в «классе», то есть оно не имеет смысла внутри методов.

+2

Он может иметь значение, которое он имеет в функциях C ... Из википедии: «Статические локальные переменные: переменные, объявленные как статические внутри внутри функции, статически распределены, имея ту же область действия, что и автоматические локальные переменные. Следовательно, любые значения, которые выполняет функция в его статические локальные переменные во время одного вызова все равно будут присутствовать, когда функция будет вызвана снова ». – 2010-07-31 15:44:14

+1

@функциональный: мое предложение основано на теге 'java' рядом с вопросом. – Roman

+3

Хорошо, понял. Я просто говорю, что иметь смысл быть внутри методов тоже. Это все – 2010-07-31 15:45:49

1

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

+1

Статические переменные внутри методов являются законными в C и C++, возможно, это его фон. –

+0

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

6

Вы можете использовать статические переменные внутри вашего метода main (или любой другой метод), но вам нужно объявить их в классе:

Это совершенно нормально:

public Class YourClass { 
    static int someNumber = 5; 

    public static void main(String[] args) { 
    System.out.println(someNumber); 
    } 
} 

Это тоже хорошо , но в этом случае someNumber является локальной переменной, а не статической.

public Class YourClass { 

    public static void main(String[] args) { 
    int someNumber = 5; 
    System.out.println(someNumber); 
    } 
} 
4

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

3

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

1

В C вы можете иметь статически выделенные локально ограниченные переменные. К сожалению, это прямо не поддерживается в Java. Но вы можете добиться такого же эффекта, используя вложенные классы.

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

static int x = 42; 
public static int getNextValue() { 
    return ++x; 
} 

Один действительно хотел бы сделать следующее, но это не законно:

public static int getNextValue() { 
    static int x = 42;    // not legal :-(
    return ++x; 
} 

Однако вы могли бы сделать это вместо того,

public static class getNext { 
    static int x = 42; 
    public static int value() { 
     return ++x; 
    } 
} 

лучше инжиниринговая за счет о некотором уродстве.

Смежные вопросы