Подтвердить что ты не робот

Как и где использовать Static-модификатор в Java?

Как и где мы должны использовать модификатор Static для:

1. Поле и
2. Метод?

Для пример в классе java.lang.Math методы полей, такие как abs(), atan(), cos() и т.д., являются статическими, т.е. к ним можно получить доступ: Math.abs()

Но почему это хорошая практика?

Скажем, я не стану статичным и создаю объект класса и получаю доступ к нему, что в любом случае я могу получить предупреждение о том, что вы пытаетесь получить доступ к статическому методу нестационарным способом ( как указано @duffymo, а не в случае класса Math).

ОБНОВЛЕНИЕ 1:

Итак, метод полезности должен быть статическим, т.е. работа которого зависит только от параметров метода. Так, например, может ли метод updateString(String inputQuery, String highlightDoc) быть статическим методом в этом вопросе?

4b9b3361

Ответ 1

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

  • Существует только одна "копия" статического поля/метода.
  • Статические поля/методы не могут получить доступ к нестатическим полям/методам.

Есть несколько примеров, когда вы хотите сделать что-то статическим.

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

Аналогичным образом, статические методы могут использоваться для выполнения заданий "utility", для которых все необходимые зависимости передаются как параметры для метода: вы не можете ссылаться на ключевое слово 'this' внутри статического метода.

В С# вы также можете иметь статические классы, которые, как вы могли догадаться, содержат только статические члены:

public static class MyContainer
{
    private static int _myStatic;

    public static void PrintMe(string someString)
    {
        Console.Out.WriteLine(someString);
        _myStatic++;
    }

    public static int PrintedInstances()
    {
        return _myStatic;
    }
}

Ответ 2

Static использует меньше памяти, поскольку он существует только один раз для Classloader.

Чтобы методы static могли сэкономить некоторое время, вам не нужно сначала создавать объект, чтобы вы могли вызвать функцию. Вы можете/должны использовать статические методы, когда они стоят в значительной степени самостоятельно (т.е. Math.abs(X) - на самом деле нет объекта, который требуется функции). В основном это удобная вещь (по крайней мере, насколько я вижу - другие могут и не согласятся: P)

Статические поля должны использоваться с осторожностью. Существует довольно много шаблонов, которым нужны статические поля... но сначала основы:

статическое поле существует только один раз. Поэтому, если у вас есть простой класс (псевдокод):

class Simple {
 static int a;
 int b;
}

и теперь вы создаете объекты с помощью:

Simple myA = new Simple();
Simple myB = new Simple();
myA.a = 1;
myA.b = 2;
myB.a = 3;
myB.b = 4;
System.out.println(myA.a + myA.b + myB.a + myB.b);

вы получите 3234 - потому что, установив myB.a, вы на самом деле перезаписываете myA.a, потому что a статично. Он существует в одном месте в памяти.

Обычно вы хотите избежать этого, потому что могут произойти действительно странные вещи. Но если вы Google, например, для Factory Pattern, вы увидите, что для этого поведения есть действительно полезные приложения.

Надеюсь, что это немного облегчит.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

public static int age = 25;

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

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

Ответ 6

Вы не можете создать экземпляр java.lang.Math; нет публичного конструктора.

Попробуйте:

public class MathTest
{
    public static void main(String [] args)
    {
        Math math = new Math();

        System.out.println("math.sqrt(2) = " + math.sqrt(2));
    }
}

Вот что вы получите:

C:\Documents and Settings\Michael\My Documents\MathTest.java:5: Math() has private access in java.lang.Math
        Math math = new Math();
                    ^
1 error

Tool completed with exit code 1