Я бы рекомендовал методы 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"));
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 или поток, но это не относится к делу.
Статика в 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, иногда называют константами. Все поля интерфейсов называются константами, потому что они являются окончательными и статическими по умолчанию.
Изображение Ресурс: Окончательный статический
Это обсуждение до сих пор проигнорировало classloader соображения. Строго говоря Java статические поля совместно используется всеми экземплярами класса для, учитывая classloader.
Может также думать о статических участниках, не имеющих "этот" указатель. Они являются общими для все экземпляры.
Это означает, что существует только один экземпляр "часов" в Привет, не один на каждый отдельный экземпляр "Привет" класс, или больше так, это означает, что будет тот обычно совместно используемая ссылка "часов" среди всех экземпляров "Привет" класс.
Поэтому, если необходимо было сделать "новый Привет" где-нибудь в коде: A-в первом сценарии (перед изменением, не используя "статичный"), это сделало бы новые часы, которыми называют каждый раз "новый Привет", но B-во втором сценарии (после изменения, с помощью "статичного"), каждый "новый Привет" экземпляр все еще совместно использовал бы и использовал бы начальную букву и ту же ссылку "часов", сначала созданную.
, Если Вы не должны были "синхронизировать" где-нибудь за пределами основного, это будет работать точно также:
package hello;
public class Hello
{
public static void main(String args[])
{
Clock clock=new Clock();
clock.sayTime();
}
}
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
Из статического метода (который принадлежит классу) Вы не можете получить доступ ни к каким участникам, которые не статичны, так как их значения зависят от Вашего инстанцирования класса. Нестатический объект Часов, который является членом экземпляра, имел бы различное значение/ссылку для каждого экземпляра Вашего Привет классом, и поэтому Вы не могли получить доступ к нему от статической части класса.
статические методы не используют переменных экземпляра класса, в котором они определяются. Очень хорошее объяснение различия может быть найдено на эта страница
Статичный делает участника часов участником класса вместо члена экземпляра. Без статического ключевого слова необходимо было бы создать экземпляр Привет класс (который имеет членскую переменную часов) - например,
Hello hello = new Hello();
hello.clock.sayTime();
Поле может быть присвоено или классу или экземпляру класса. Полями по умолчанию переменные экземпляра. При помощи static
поле становится переменной класса, таким образом существует один и только один clock
. При создании изменений в одном месте это видимо везде. Экземпляр varables изменяется друг независимо от друга.
Ключевое слово static
в Java означает, что переменная или функция совместно используются всеми экземплярами этого класса, так как они принадлежат к типу , а не самим объектам.
Итак, если у вас есть переменная: private static int i = 0;
и вы увеличиваете ее ( i ++
) в одном экземпляре, изменение будет отражено во всех экземплярах. i
теперь во всех экземплярах будет 1.
Статические методы можно использовать без создания экземпляра объекта.
Ключевое слово 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);
(0...n).to_a.permutation { |a| puts a.inspect }
– Bob Aman 22 April 2013 в 01:19