Что делает ключевое слово static в классе?

Я бы рекомендовал методы call_user_func() или call_user_func_array php. Вы можете проверить их здесь ( call_user_func_array , call_user_func ).

example

class Foo {
static public function test() {
    print "Hello world!\n";
}
}

 call_user_func('Foo::test');//FOO is the class, test is the method both separated by ::
 //or
 call_user_func(array('Foo', 'test'));//alternatively you can pass the class and method as an array

Если у вас есть аргументы, вы переходя к методу, затем используйте функцию call_user_func_array().

.

class foo {
function bar($arg, $arg2) {
    echo __METHOD__, " got $arg and $arg2\n";
}
}

// Call the $foo->bar() method with 2 arguments
call_user_func_array(array("foo", "bar"), array("three", "four"));
//or
//FOO is the class, bar is the method both separated by ::
call_user_func_array("foo::bar"), array("three", "four"));

426
задан Hamid Pourjam 19 April 2015 в 08:29
поделиться

11 ответов

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

Это означает, что только один экземпляр static поле существует <глоток> [1] , даже если Вы создаете миллион экземпляров класса, или Вы не создаете никого. Это будет совместно использовано всеми экземплярами.

С тех пор static методы также не принадлежат определенному экземпляру, они не могут обратиться к членам экземпляра. В данном примере, main не знает, к какому экземпляру Hello класс (и поэтому который экземпляр Clock класс) он должен относиться. static участники могут только обратиться к static участники. Члены экземпляра могут, конечно, доступ static участники.

примечание Стороны: , Конечно, static участники могут получить доступ к членам экземпляра через Пример ссылки на объект .

:

public class Example {
    private static boolean staticField;
    private boolean instanceField;
    public static void main(String[] args) {
        // a static method can access static fields
        staticField = true;

        // a static method can access instance fields through an object reference
        Example instance = new Example();
        instance.instanceField = true;
    }

[1]: В зависимости от характеристик во время выполнения это может быть один на ClassLoder или AppDomain или поток, но это не относится к делу.

604
ответ дан TechnicallyTrue 19 April 2015 в 08:29
поделиться
  • 1
    Кстати, текущая версия Ruby имеет это встроенное: (0...n).to_a.permutation { |a| puts a.inspect } – Bob Aman 22 April 2013 в 01:19

Статика в Java:

Статика - это модификатор отсутствия доступа. Ключевое слово static относится к классу, а не к экземпляру класса. может использоваться для прикрепления переменной или метода к классу.

Статическое ключевое слово МОЖЕТ использоваться с:

Метод

Переменная

Класс, вложенный в другой класс

Блок инициализации

НЕ МОЖЕТ использоваться с:

Класс (не вложенный)

Конструктор

Интерфейсы

Метод Локальный внутренний класс (отличие от вложенного класса)

Методы внутреннего класса

Переменные экземпляра

Локальные переменные

Пример:

Представьте себе следующий пример, в котором есть переменная экземпляра с именем count , которая увеличивается в конструкторе:

package pkg;

class StaticExample {
    int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

Вывод:

1 1 1

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

Теперь, если мы изменим число переменных экземпляра на статическое , программа выдаст другой вывод:

package pkg;

class StaticExample {
    static int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

Вывод:

1 2 3

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

Static with Final:

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

enter image description here

Изображение Ресурс: Окончательный статический

20
ответ дан Virtual 19 April 2015 в 08:29
поделиться

Это обсуждение до сих пор проигнорировало classloader соображения. Строго говоря Java статические поля совместно используется всеми экземплярами класса для, учитывая classloader.

13
ответ дан Julien Chastang 19 April 2015 в 08:29
поделиться
  • 1
    хорошо, I' ll испытывают это. (передачи времени), Это работало. Вы знаете, what' s печальный то, что пароль для значения по умолчанию keystore действительно является ' changeit'. спасибо. – Shawn D. 18 August 2010 в 03:25

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

3
ответ дан kal 19 April 2015 в 08:29
поделиться
  • 1
    Мне потребовалось довольно долгое время, чтобы удаться как к ' засуньте больше чем один объект в outlet' в xcode 4. После создания IBOutletCollection в коде я ожидал быть в состоянии к CTRL-Drag от UIImageView до него. Этот doesn' t работа, по некоторым причинам. Что действительно работает, хотя должен выбрать ' File' s Owner' затем откройте ' Соединения inspector' затем перетащите от ' Выход collections' разделите к каждому UIImageView в свою очередь. – Ben Clayton 30 March 2011 в 22:27

Это означает, что существует только один экземпляр "часов" в Привет, не один на каждый отдельный экземпляр "Привет" класс, или больше так, это означает, что будет тот обычно совместно используемая ссылка "часов" среди всех экземпляров "Привет" класс.

Поэтому, если необходимо было сделать "новый Привет" где-нибудь в коде: A-в первом сценарии (перед изменением, не используя "статичный"), это сделало бы новые часы, которыми называют каждый раз "новый Привет", но B-во втором сценарии (после изменения, с помощью "статичного"), каждый "новый Привет" экземпляр все еще совместно использовал бы и использовал бы начальную букву и ту же ссылку "часов", сначала созданную.

, Если Вы не должны были "синхронизировать" где-нибудь за пределами основного, это будет работать точно также:

package hello;
public class Hello
{
    public static void main(String args[])
    {
      Clock clock=new Clock();
      clock.sayTime();    
    }
}
129
ответ дан Community 19 April 2015 в 08:29
поделиться
  • 1
    Право, так чтобы заставить его вести себя как strlen, Вы не могли просто сделать #define STRLEN(s) ( (sizeof(s)/sizeof(s[0])) - sizeof(s[0]) )? – James 16 February 2011 в 21:11

Статичный означает, что Вы не должны создавать экземпляр класса для использования методов или переменных, связанных с классом. В Вашем примере Вы могли звонить:

Hello.main(new String[]()) //main(...) is declared as a static function in the Hello class

непосредственно, вместо:

Hello h = new Hello();
h.main(new String[]()); //main(...) is a non-static function linked with the "h" variable

Из статического метода (который принадлежит классу) Вы не можете получить доступ ни к каким участникам, которые не статичны, так как их значения зависят от Вашего инстанцирования класса. Нестатический объект Часов, который является членом экземпляра, имел бы различное значение/ссылку для каждого экземпляра Вашего Привет классом, и поэтому Вы не могли получить доступ к нему от статической части класса.

19
ответ дан Programmer 19 April 2015 в 08:29
поделиться
  • 1
    Вы знаете о лучшем пароле для значения по умолчанию keystore? – Thorbjørn Ravn Andersen 18 August 2010 в 03:56

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

5
ответ дан Marc Novakowski 19 April 2015 в 08:29
поделиться
  • 1
    В предварительном просмотре разработчика xcode 5 проблема, что упомянутый @BenClayton, кажется, разрешен - CTRL-Drag теперь, работает для привязки с массивом. Хороший ответ здесь! – Dustin Wilhelmi 13 June 2013 в 01:29

Статичный делает участника часов участником класса вместо члена экземпляра. Без статического ключевого слова необходимо было бы создать экземпляр Привет класс (который имеет членскую переменную часов) - например,

Hello hello = new Hello();
hello.clock.sayTime();
5
ответ дан Stephen Doyle 19 April 2015 в 08:29
поделиться
  • 1
    Да, мы don' t получают привязку какао на iPhone, таким образом, это является действительно лучшим, мы можем сделать. Это отвечало на вопрос? – Sam Ritchie 5 December 2010 в 00:28

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

7
ответ дан sblundy 19 April 2015 в 08:29
поделиться

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

Итак, если у вас есть переменная: private static int i = 0; и вы увеличиваете ее ( i ++ ) в одном экземпляре, изменение будет отражено во всех экземплярах. i теперь во всех экземплярах будет 1.

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

41
ответ дан 22 November 2019 в 23:15
поделиться

Ключевое слово static означает, что что-то (поле, метод или вложенный класс) связано с типом , а не с каким-либо конкретным экземпляром типа. Так, например, вы вызываете Math.sin (...) без какого-либо экземпляра класса Math , и вы действительно не можете создать экземпляр класса класс Math .

Для получения дополнительной информации см. соответствующий бит Oracle's Java Tutorial .


Sidenote

Java, к сожалению, позволяет вам доступ к статическим членам, как если бы они были членами экземпляра, например

// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);

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

// Clearer
Thread.sleep(5000);
96
ответ дан 22 November 2019 в 23:15
поделиться
Другие вопросы по тегам:

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