所以我正在尝试为课堂做作业,但遇到了一个奇怪的问题。每当我在类 Queue 的一个实例中修改变量 size 时,它也会修改该类的另一个实例的size变量。例如
Queue takeoffQueue=new Queue();
Queue landingQueue=new Queue();
System.out.println("TakeoffSize "+takeoffQueue.size);
System.out.println("LandingSize "+landingQueue.size);
takeoffQueue.size++;
System.out.println("TakeoffSize "+takeoffQueue.size);
System.out.println("LandingSize "+landingQueue.size);
将打印出来:
TakeoffSize 0
LandingSize 0
TakeoffSize 1
LandingSize1
有谁知道这是为什么?
答案 0 :(得分:1)
你可以这样看(简化):
静态变量是类范围的。如果将值设置为静态变量,则表示它适用于该类的所有过去,当前和当前实例。
另一方面,实例变量定义绑定到问题的一个特定实例的属性。
再次,用外行术语来说:
public class Person {
public static int NUMBER_OF_EYES = 2;
public int numberOfHealthyEyes;
}
可以合理地假设所有人都有2只眼睛,这是所有人类共有的特征。然而,个人(人的实例)可能具有不同数量的健康眼睛。有些人可能是盲人,因此他们的数字为0,依此类推。
简而言之,当您需要描述类实例的内部状态的一部分时,您使用实例变量。如果要描述共享属性,可以使用静态属性。
这里是关于Java中变量的Oracle页面链接:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html
答案 1 :(得分:0)
也许我迟到了,只是想根据我的观点解释static
和non-static
之间的区别。
我认为(当您提到size变量的声明时),您声明的size
变量是一个静态变量,它会为内存中该类的所有对象生成相同的值。
<强>静态:强>
所以当你这样做时
static int size=0;
Queue takeoffQueue=new Queue();
Queue landingQueue=new Queue();
内存中会发生什么
size
变量在该类的所有对象之间共享,因此如果您为任何对象更改size
的值,它也会受到其他对象的影响。
<强>非静态:强>
如果你已经完成了
int size=0;
Queue takeoffQueue=new Queue();
Queue landingQueue=new Queue();
创建的内存类似于
在这种情况下,该类的每个对象都有自己的size
变量,因此如果增加一个对象的size
变量,它将不会影响其他对象的大小变量。
您可以选择所需的变量类型。如果你有一个同一所学校的Student
班,那么变量schoolName
将是静态的,因为所有学生(对象)的学校名称都相同,其优点是节省了内存而不是创建{{ 1}}对于每个对象都是非静态的。另一方面,变量schoolName
将是非静态的,因为它对于eact对象会有所不同。