Java中C的“静态”关键字相当于什么?

我想知道什么可能是java中的等效关键字,它可以执行与“C中的静态关键字”相同的function。我想在java中执行递归,执行与C中的静态关键字相同的function…

请帮忙..

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 。 它也可以被protectedprivate以进一步限制其范围。

现在,Java中这3种用法的类比是什么?

案例1没有直接模拟; 最接近的是使用包范围声明对象,这通过省略publicprotectedprivate

 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关键字用于完全相同的目的。

C中的"static"关键字实际上提供两个函数,具体取决于它的使用位置。 这些function是可见性和持续时间(这些是基于相当多的教学的我的术语,标准,如果你对这个细节水平感兴趣,使用不同的术语,我经常发现混淆新学生,因此我对使用它们保持沉默)。

  • 在文件级别使用时,它将项目(变量或函数)标记为未导出,以便链接器无法看到它。 这是静态的,因为可见性,持续时间与程序相同(即,直到程序退出)。 这对于将项目封装在单个编译单元(源文件,最简单的定义)中非常有用。 该项目可供整个编译单元使用(假设它在使用前已声明)。
  • 在函数中使用时,它控制持续时间(可见性仅限于函数内)。 在这种情况下,该项目也会创建一次并持续到程序退出。 函数内的非静态变量在函数入口和出口处创建和销毁。

我收集你所追求的是第一种类型,基本上是一个全局变量,因为我无法在递归中立即看到其他变体的大量用途。

它无法完成,因为在Java中, 一切都必须属于一个类。 解决方法是创建一个包含“globals”的类,并且:

  • 传递该对象,以便您可以引用其成员; 要么
  • 构造一个单例项,以便您可以访问其成员。

Java没有全局变量,因此没有直接的等价物。 但是,Java中有一个static关键字,它与一个类的所有实例共享一个字段的状态,这与你所描述的内容非常接近。

我想在java中进行递归,执行与C中的静态关键字相同的function…

但是,如果您正在寻求递归, 您确定您需要静态变量吗? 递归函数调用所需的任何特殊状态几乎总是传递回自身,而不是单独维护。

Java中静态的概念不符合C中静态的概念。但是,Java中也有一个静态关键字。 但它更像是C ++中的静态然后C,有一些差异。

您可以在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) {...} } 

这个类不能被inheritance(比如final,因为虽然它有一个私有的constuctor),但是不能实例化(比如static因为抽象)所以只能调用它中的静态方法。