C имеет два совершенно разных использования ключевого слова static
, а C ++ добавляет третье использование:
// Use 1: declare a variable or function to be local to a given module
// At global scope:
static int global_var;
static void func();
В этом случае глобальная переменная global_var
и функция void func()
доступны только внутри файла, в котором они объявлены; они не могут быть доступны для любого другого файла.
// Use 2: declare a variable inside a function with global scope
void func(void)
{
static int x;
}
В этом случае переменная x
фактически является глобальной переменной, в которой существует только один ее экземпляр - множественные вызовы func()
(включая рекурсивные вызовы) всегда будут обращаться к одной и той же переменной.
// Use 3 (C++ only): declare a global variable with class scope
class Widget
{
public:
static int var;
};
В этом случае переменная Widget::var
объявляется как глобальная переменная, но ее область действия отличается. За пределами функций-членов класса он должен иметь имя Widget::var
; внутри функций-членов класса его можно назвать просто var
. Его также можно сделать protected
или private
, чтобы еще больше ограничить сферу его применения.
Теперь, какие аналоги этих 3-х используются в Java?
Корпус 1 не имеет прямого аналога; самым близким является объявление объектов с областью действия пакета, что делается путем пропуска public
, protected
или private
:
class Widget // Declare a class with package scope
{
int x; // Declare a member variable with package scope
void func() {} // Declare a member function with package scope
}
В этом случае объявленные объекты доступны только классам в одном и том же пакете; они не доступны для других пакетов.
Случай 2 также не имеет аналога в Java. Самое близкое, что вы можете получить, это объявить глобальную переменную (то есть статическую переменную класса, поскольку Java не имеет истинных глобальных переменных в самом строгом смысле):
class Widget
{
private static int func_x;
public static void func()
{
// use func_x here in place of 'static int x' in the C example
}
}
Случай 3 является единственным случаем, который имеет прямой аналог в Java. В этом случае ключевое слово static
служит точно такой же цели.