繁体   English   中英

Java 中 C 的“静态”关键字的等价物是什么?

[英]What's the equivalent of C's "static" keyword in Java?

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

请帮忙..

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"关键字实际上有两个功能,具体取决于它的使用位置。 这些功能是可见性和持续时间(这些是我基于大量教学的术语,标准,如果你对那个级别的细节感兴趣,使用不同的术语,我经常发现这些术语会让新学生感到困惑,因此我对使用它们保持沉默)。

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

我收集到你所追求的是第一种类型,基本上是一个全局变量,因为我不能立即看到递归中其他变体的很多用途..

这是不可能的,因为在 Java 中,一切都必须属于一个类。 解决方法是创建一个包含“全局变量”的类,并且:

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

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

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

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

静态的Java中的概念不与C.静态的概念,坚持然而,在Java中的static关键字也是如此。 但它更像是 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) {...}
    }

这个类不能被继承(像 final 因为虽然抽象它有一个私有构造器),不能被实例化(像静态因为抽象)所以只能调用其中的静态方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM