我有这样的场景
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);
}
}