Я слышал, что статические методы должны использовать только статические переменные в Java. Но, основной метод также статичен, правильно?
Ваш вопрос: правильно ли утверждение «статические методы должны использовать только статические переменные»?
Нет. Утверждение неверное.
Правильным утверждением будет «статические методы могут использовать только те переменные экземпляра, которые определены static»
Взгляните на следующий код и прочтите комментарии:
Class A{
int i;
static int j;
public static void methodA(){
i = 5; //cannot use since i is not static
j = 2; //can use.
int k = 3; //k is local variable and can be used no problem
**EDIT:**//if you want to access i
A a = new A();
//A.i = 5; //can use.
a.i = 5; // it should be non-capital "a" right?
}
}
Прежде всего, техническая сторона: НЕ верно, что « main
метод также является статическим». Вы можете определить нестатический метод main
с любой выбранной вами подписью; это просто не будет допустимой точкой входа в Java-приложение.
Что касается «статические методы должны использовать только статические переменные», это также НЕ истина. Ключевой концепцией здесь является то, что статические методы и поля зависят от класса, а не от экземпляра. Вы просто не можете получить доступ к переменной / методу экземпляра, если на самом деле у вас нет экземпляра этого класса; это ошибка компиляции.
Чтобы быть точным, без экземпляра вы не можете получить доступ к полям / методам экземпляра. Вы можете получить доступ к статическим полям / методам без экземпляра. Если вам нужно получить доступ к полям / методам экземпляра из статического метода, вы должны получить экземпляр этого класса тем или иным способом, либо просто создав его экземпляр, либо получив ссылку на него из статического поля или параметра метода.
Давайте посмотрим на этот простой пример:
public static void main(String args[]) {
System.out.println(args.length);
}
length
- это НЕ статическое поле; это поле экземпляра экземпляров массива, которым является args
. Статический метод main
может получить этот экземпляр (и, таким образом, получить доступ к его методам и полям экземпляра), потому что он передается в качестве аргумента.
Кроме того, println
не является НЕ статическим методом; это метод экземпляра PrintStream
экземпляров.Статический метод main
может получить этот экземпляр, обращаясь к статическому полю out
класса System
.
Подводя итог:
main
общедоступным
и static
void
и принимает аргумент String []
в качестве параметра main
не обязательно должен быть Точка входа в приложение Java
Кроме того,
нового
экземпляр static
класса static
метода класс Throwable
Возможно, этот фрагмент кода просветит вас:
public class Main {
private String instanceField = "Joe";
private void instanceMethod() {
System.out.println("Instance name=" + instanceField);
}
public static void main(String[] args) {
// cannot change instance field without an instance
instanceField = "Indy"; // compilation error
// cannot call an instance method without an instance
instanceMethod(); // compilation error
// create an instance
Main instance = new Main();
// change instance field
instance.instanceField = "Sydney";
// call instance method
instance.instanceMethod();
}
}
Таким образом, вы не можете получить доступ к членам экземпляра без экземпляра. В контексте статического метода у вас нет ссылки на экземпляр, если вы не получите или не создадите его.
Надеюсь, это поможет.
Для доступа к нестатическим полям (переменным экземпляра) вам нужен экземпляр.
Внутри нестатического метода this
используется как экземпляр по умолчанию :
class AnyClass {
private String nonStaticField = "Non static";
void nonStaticMethod() {
this.nonStaticField = "a text"; // accessing field of this
nonStaticField = "a text"; // same as before
}
}
Внутри статического метода нет this
для использования в качестве экземпляра по умолчанию , но вы можете 1 по-прежнему обращаться к переменным экземпляра, если предоставите экземпляр:
class AnyClass {
private String nonStaticField = "Non static";
static void staticMethod() {
AnyClass example = new AnyClass();
example.nonStaticField = "new value for non-static field";
}
}
1 - поле также должно быть доступно с помощью управления доступом Java (объявлено общедоступным
или в том же классе ...)
Статический метод вызывается на экземпляре класса, а не на объекте класса. Это означает, что статический метод не может получить доступ к переменным экземпляра, поскольку они только инстанцируются в объекте.
Если вы хотите получить доступ к переменной экземпляра с помощью статического метода, вы должны объявить эту переменную как статическую.
public class Test {
private static int value = 0;
public static void main(String[] args) {
value++;
}
}
Но, честно говоря, это не лучшая идея - писать все в статических методах. Лучше использовать метод main для инстанцирования новых объектов.
Да, статический метод не может напрямую вызывать нестатические методы или переменные класса.
РЕДАКТИРОВАТЬ : можно создавать любые локальные переменные.