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中会出现什么变量