Статический метод в Java

Я слышал, что статические методы должны использовать только статические переменные в Java. Но, основной метод также статичен, правильно?

5
задан polygenelubricants 22 April 2010 в 12:52
поделиться

6 ответов

Ваш вопрос: правильно ли утверждение «статические методы должны использовать только статические переменные»?

Нет. Утверждение неверное.

Правильным утверждением будет «статические методы могут использовать только те переменные экземпляра, которые определены 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?
    }
}
16
ответ дан 18 December 2019 в 05:19
поделиться

Прежде всего, техническая сторона: НЕ верно, что « main метод также является статическим». Вы можете определить нестатический метод main с любой выбранной вами подписью; это просто не будет допустимой точкой входа в Java-приложение.

Что касается «статические методы должны использовать только статические переменные», это также НЕ истина. Ключевой концепцией здесь является то, что статические методы и поля зависят от класса, а не от экземпляра. Вы просто не можете получить доступ к переменной / методу экземпляра, если на самом деле у вас нет экземпляра этого класса; это ошибка компиляции.

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

Давайте посмотрим на этот простой пример:

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

length - это НЕ статическое поле; это поле экземпляра экземпляров массива, которым является args . Статический метод main может получить этот экземпляр (и, таким образом, получить доступ к его методам и полям экземпляра), потому что он передается в качестве аргумента.

Кроме того, println не является НЕ статическим методом; это метод экземпляра PrintStream экземпляров.Статический метод main может получить этот экземпляр, обращаясь к статическому полю out класса System .


Подводя итог:

  • Точка входа в приложение Java - это метод, который:
    • называется main
    • является общедоступным и static
    • возвращает void и принимает аргумент String [] в качестве параметра
  • Метод с именем main не обязательно должен быть Точка входа в приложение Java
    • (но лучше всего зарезервировать это имя для этой цели)

Кроме того,

  • Поля / методы экземпляра могут быть доступны только через экземпляр
  • К статическим полям / методам можно получить доступ без экземпляра
  • Статические методы могут получить экземпляр класса одним из следующих способов:
    • создание нового экземпляр
    • , передавая его в качестве аргумента
    • , обращаясь к нему через поле static класса
    • , принимая его как возвращаемое значение static метода класс
    • , улавливающий его как брошенный Throwable
17
ответ дан 18 December 2019 в 05:19
поделиться

Возможно, этот фрагмент кода просветит вас:

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();  
    }
}

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

Надеюсь, это поможет.

3
ответ дан 18 December 2019 в 05:19
поделиться

Для доступа к нестатическим полям (переменным экземпляра) вам нужен экземпляр.
Внутри нестатического метода 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 (объявлено общедоступным или в том же классе ...)

2
ответ дан 18 December 2019 в 05:19
поделиться

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

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

public class Test {
    private static int value = 0;

    public static void main(String[] args) {
        value++;
    }
}

Но, честно говоря, это не лучшая идея - писать все в статических методах. Лучше использовать метод main для инстанцирования новых объектов.

2
ответ дан 18 December 2019 в 05:19
поделиться

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

РЕДАКТИРОВАТЬ : можно создавать любые локальные переменные.

0
ответ дан 18 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

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