Как и где использовать модификатор Static в Java? - PullRequest
12 голосов
/ 19 октября 2010

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

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

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

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

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

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

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

Ответы [ 7 ]

20 голосов
/ 19 октября 2010

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

  1. Существует только одна «копия» статического поля / метода.
  2. Статические поля / методы не могут получить доступ к нестатическим полям / методам.

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

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

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

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

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;
    }
}
8 голосов
/ 19 октября 2010

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

Чтобы статические методы могли сэкономить некоторое время, потому что вам не нужно сначала создавать объект, чтобы вы могли вызвать функцию.Вы можете / должны использовать статические методы, когда они в значительной степени стоят сами по себе (т.е. 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 , вы увидите, что на самом деле есть довольно полезные варианты использования этого поведения.

Надеюсь, что это немного прояснится.

2 голосов
/ 19 октября 2010

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

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

1 голос
/ 19 октября 2010

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

public static int age = 25;

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

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

1 голос
/ 19 октября 2010

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

0 голосов
/ 03 апреля 2018
class StaticModifier
{    

    {
        System.out.println("Within init block");//third
    }
    public StaticModifier()
    {
        System.out.println("Within Constructor");//fourth
    }
    public static void main(String arr[])
    {
    System.out.println("Within Main:");//second
    //StaticModifier obj=new StaticModifier();
    }
    static
    {
    System.out.print("Within static block");//first
    }
}
0 голосов
/ 19 октября 2010

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