java中的静态变量



我有这样的场景

public class Test{
   static int a;
   int b;
   public static void main(String[] args){
      Test t1  = new Test();
      Test t2 = new Test();
   }
}

对象t1和对象t2中的变量是什么?

根据我的理解,由于变量a是一个静态变量,它将同时位于对象1和对象2中。

b将为这两个对象创建单独的副本。

但是当我给变量bie(int b=1)赋值并像System.out.println(t1.b)System.out.println(t2.b) 那样调用它时

我没有得到一个错误,而是从两个对象得到1作为输出。

为什么?

根据我的理解,由于变量a是静态变量,它将同时在对象1和对象2中。

没有。它不在对象中。它的存在根本没有引用任何特定的实例。尽管Java允许通过引用来引用它,例如int x = t1.a;,但你不应该这样做。你应该通过类名来引用它(在你的情况下是test.a,尽管你也应该开始遵循Java命名约定),以明确它是静态的。

b将为这两个对象创建单独的副本。

是的。

但是,当我为变量bie(int b=1)分配一个值并像System.out.println(t1.b), System.out.println(t2.b)一样调用它时,我得到的不是一个错误,而是两个对象的输出1。

这是因为你基本上给了它一个初始值,为每个新对象赋值。这完全合理。仍有两个自变量:

t1.b = 2;
t2.b = 3;
System.out.println(t1.b); // Prints 2
System.out.println(t2.b); // Prints 3
静态变量是在所有对象之间共享的类成员。主存储器中只有一个副本。静态变量是在运行时在堆区域上创建的。

如果是你的。。。

int b = 1; 

这是类级别的赋值,使变量b的默认值为1(在正常情况下,默认值为0)。因此,当你打印它时,它会给你ans为1而不是错误。

int b = 1; //initialized b to 1 for all obj of class Test
System.out.println(t1.b); // Prints 1
System.out.println(t2.b); // Prints 1
不,静态变量不是实例变量而是类变量。

也就是说,这个类的每个实例都共享这些变量的相同引用。

了解类成员

这里a是静态变量,b是实例或非静态变量。

对于静态变量,只为所有对象创建一个副本,而对于实例变量,则为每个对象创建一份副本。这里,当b=1时,对于该Test类的每个对象,都会创建一个副本,并且它可以通过其对象名称访问它。所以输出将是1。

当然,这正是它应该输出的。如果你分配,比如

int b=1; 

该赋值在类级别,使变量b的默认值为1。然而,如果你这样分配:

t1.b=1;

其将仅将1分配给对象t1中的变量b的副本。

试试看。

static变量是类变量。CCD_ 11变量存储在静态存储器中。

创建static变量以访问main()方法内部。如果static变量存在于外部类中,则可以通过它们的类名来访问它们。

class sv {
  static String name = "abc";
}
public class staticvariable {
  static int t;
  public static void main(String[] args) {
    System.out.println("static variable is - "+t);
    System.out.println(sv.name);
    t=100;
    System.out.println(t);
  }
}

相关内容

  • 没有找到相关文章

最新更新