Что эквивалентно «статическому» ключевому слову C в Java? - PullRequest
8 голосов
/ 08 апреля 2009

Я хочу знать, что может быть эквивалентным ключевым словом в Java, которое может выполнять ту же функцию, что и «Статическое ключевое слово в C». Я хочу выполнить рекурсию в Java, выполняя ту же функцию, что статическое ключевое слово в C ...

Пожалуйста, помогите ..

Ответы [ 5 ]

30 голосов
/ 08 апреля 2009

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 служит точно такой же цели.

10 голосов
/ 08 апреля 2009

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

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

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

Это невозможно сделать, поскольку в Java все должно принадлежать классу. Обходной путь должен создать класс, содержащий «глобальные переменные» и либо:

  • передать этот объект, чтобы вы могли ссылаться на его членов; или
  • создать единичный элемент, чтобы вы могли получить доступ к его элементам.
5 голосов
/ 08 апреля 2009

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

Я хочу сделать рекурсию в Java, выполняя ту же функцию, что и статическое ключевое слово в C ...

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

1 голос
/ 08 апреля 2009

Концепция static в Java не соответствует концепции static в C. Однако в Java также есть ключевое слово static . , Но это больше похоже на static в C ++, чем на C, с некоторыми отличиями.

0 голосов
/ 04 августа 2009

Вы можете смоделировать статический класс в Java следующим образом:

   /**
     * Utility class: this class contains only static methods and behaves as a static class.
     */

public abstract class Utilities
    {
        // prevent inheritance
        private Utilities()
        {
        }
    // ... all your static methods here
        public static Person convert(string) {...}
    }

Этот класс не может быть унаследован (как final, потому что, хотя abstract, он имеет частный конструктор), он не может быть создан (как static, потому что abstract), поэтому в нем могут быть вызваны только статические методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...