Java-同时修改对象的两个单独实例

时间:2015-02-23 05:39:44

标签: java eclipse class oop

所以我正在尝试为课堂做作业,但遇到了一个奇怪的问题。每当我在类 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

有谁知道这是为什么?

2 个答案:

答案 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)

也许我迟到了,只是想根据我的观点解释staticnon-static之间的区别。

我认为(当您提到size变量的声明时),您声明的size变量是一个静态变量,它会为内存中该类的所有对象生成相同的值。

<强>静态:

所以当你这样做时

static int size=0;
Queue takeoffQueue=new Queue();
Queue landingQueue=new Queue();

内存中会发生什么

Static varible common memory

size变量在该类的所有对象之间共享,因此如果您为任何对象更改size的值,它也会受到其他对象的影响。

<强>非静态:

如果你已经完成了

    int size=0;
    Queue takeoffQueue=new Queue();
    Queue landingQueue=new Queue();

创建的内存类似于

Non-static varible each variable have its own space

在这种情况下,该类的每个对象都有自己的size变量,因此如果增加一个对象的size变量,它将不会影响其他对象的大小变量。

您可以选择所需的变量类型。如果你有一个同一所学校的Student班,那么变量schoolName将是静态的,因为所有学生(对象)的学校名称都相同,其优点是节省了内存而不是创建{{ 1}}对于每个对象都是非静态的。另一方面,变量schoolName将是非静态的,因为它对于eact对象会有所不同。