java - 区分 Java 和 C 中的 "static"

标签 java c static

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

4年前关闭。




Improve this question




我正在同时学习 Java 和 C,当尝试连接这两种语言的一些共同特性时,我有时会有点困惑。我试图找出 Java 和 C 中“静态”用法的区别,希望有人能指出我的理解方式是否正确。我的逻辑有什么可以改进的吗(还想知道你如何区分这两种语言中“静态”的用法)?

因此,在 C 中,当您希望某些特定变量只初始化一次时,使用“静态”。我认为仅此而已。

例如:

int main(void){
    for(int i=0;i<=5;i++){
        static int x=35; //x is only initialized once
        x++;
        printf("%d ",x); //"36 37 38 39 40 41 "will be printed out 
    }
    x++; //This is not allowed as x is not a global variable.
    return 0;
}

但是在 Java 中,当您希望某些变量或方法可以使用保存变量或方法的类的名称而不是某些对象的名称来访问或调用时,使用“静态”。我认为(通常,如果不总是?)您在驱动程序类中执行“ClassName.SomeVariables”或 ClassName.SomeMethods?

因此,“静态”在 C 和 Java 中的用法有很大不同吗?还有一个相关的问题:C 中的“静态”和 Java 中的特性如何实现?

提前致谢。 ^_^

最佳答案

C 中的静态变量

静态变量具有保留其值的属性,即使它们超出了它们的范围!因此,静态变量在其先前的作用域中保留其先前的值,并且不会在新的作用域中再次初始化。

程序运行时,静态变量保留在内存中。当声明变量的函数调用结束时,普通或自动变量将被销毁。

例如,它用于跟踪函数被调用的次数。

例如下面的程序打印“1 2”

#include<stdio.h>
int fun()
{
  static int count = 0;
  count++;
  return count;
}

int main()
{
  printf("%d ", fun());
  printf("%d ", fun());
  return 0;
}

但下面的程序打印“1 1”
#include<stdio.h>
int fun()
{
  int count = 0;
  count++;
  return count;
}

int main()
{
  printf("%d ", fun());
  printf("%d ", fun());
  return 0;
}

Java 中的静态变量

在 java 中,静态变量是与类相关联的变量,而不是与该类的对象相关联的变量。

让我们看一个例子。为了使事情尽可能简单,我们将使用一个公共(public)静态变量。如果您还没有遇到公众,请不要担心!在这些特定的例子中,实际上并没有什么区别。
public class Stuff {
    public static String name = "I'm a static variable";
}

现在我们可以在另一个类中访问这个类,
public class Application {

    public static void main(String[] args) {
        System.out.println(Stuff.name);
    }

}

您可以看到,我们可以愉快地访问 Stuff 类中的“name”实例变量,而无需实际创建 Stuff 类型的对象。

另一个用于跟踪现有类的对象数量的示例,
class VariableDemo
{
   static int count=0;
   public void increment()
   {
       count++;
   }
   public static void main(String args[])
   {
       VariableDemo obj1=new VariableDemo();
       VariableDemo obj2=new VariableDemo();
       obj1.increment();
       obj2.increment();
       System.out.println("Obj1: count is="+obj1.count);
       System.out.println("Obj2: count is="+obj2.count);
   }
}

输出 :
Obj1: count is=2
Obj2: count is=2

关于java - 区分 Java 和 C 中的 "static",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48163647/

相关文章:

java - 为什么 Kotlin 使用 == 来表示结构相等而引入 === 来表示引用相等

c - 为什么Linux kernel 3.0+取消super_operations.read_inode?求新的引用~

c# - 如何在另一个应用程序域中设置静态 bool 值?

c++ - 在静态上使用未命名的命名空间

c++ - 具有静态存储的变量地址模板

class - 在 JDK 5 环境中找不到 java 类.. 在 JDK 6 中找不到

java - JSON 对象的 REST Post 不处理 java 中日期值中的空格

java - Java/Struts 中基于角色的操作授权

C:难以理解这个基于文件/结构的指令

python - 在 Python(还有 MySQL)中使用 C/C++ 进行繁重的计算