java中的静态变量

java中的静态变量,java,variables,static,instance-variables,Java,Variables,Static,Instance Variables,我有这样的场景 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赋值(i

我有这样的场景

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赋值(
intb=1
)并像调用
System.out.println(t1.b)
System.out.println(t2.b)

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

为什么呢

根据我的理解,因为变量a是静态变量,所以它将同时位于对象1和对象2中

不,两个物体都没有。它根本不引用任何特定实例而存在。尽管Java允许您“通过”引用来引用它,例如
intx=t1.a你不应该这样做。相反,您应该通过类名(
test.a
在您的例子中——尽管您也应该开始遵循Java命名约定)来引用它,以明确它是静态的

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

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

这是因为你基本上已经给了它一个初始值来分配给每个新对象。这是完全合理的。还有两个自变量:

t1.b = 2;
t2.b = 3;
System.out.println(t1.b); // Prints 2
System.out.println(t2.b); // Prints 3

不,静态变量不是实例变量,而是类变量

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


看看

当然,这正是它应该输出的内容。 如果你说

int b=1; 
该赋值在类级别,使1成为变量b的默认值。 但是,如果您这样分配:

t1.b=1;
这将仅将1分配给对象t1中变量b的副本


试试看

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

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

静态变量是在所有对象之间共享的类成员。主内存中只有一个副本。静态变量是在运行时在堆区域上创建的

以防你

int b = 1; 
这是一个类级别的赋值,使1成为变量b的默认值(正常情况下默认值为0)。因此,当您打印它时,它将为您提供ans as 1 not错误

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

因为b是一个局部变量,所以它不应该是可访问的。但是我没有得到任何错误,相反,我得到的是值,你能帮我一个example@prasad:您没有说您已将其更改为局部变量。显示的代码将其声明为字段。我以为你只是在改变
intb
intb=1。如果不是这样的话,你应该编辑你的问题,以显示实际的代码,而不是含糊其辞地描述它,让我们猜测你的意思。如果b没有被赋值,t1和t2中会出现什么变量1@prasad该值将为0。不过,在构造函数中初始化变量的值是一种很好的做法。@prasad:同样的变量会出现(每个变量中只有
b
),但值是0而不是1。我通常避免“此类的每个实例都共享…”术语,因为这意味着实例有一些知识,或者你需要一些实例才能进入现场。我更喜欢说它与实例无关,而是与类型相关。是的,你说得对,因为不需要实例来访问类变量t1和t2中会出现什么变量