【问题标题】:Java-Two separate instances of an object both being modified at the same timeJava - 一个对象的两个独立实例同时被修改
【发布时间】:2015-02-23 05:39:43
【问题描述】:

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

将打印出来:

起飞尺寸 0

着陆尺寸 0

起飞尺寸 1

着陆尺寸1

有人知道这是为什么吗?

【问题讨论】:

  • 你的队列类在哪里?
  • 如果size 变量是static,就会发生这种情况
  • 不要在队列中使用静态变量
  • size 设为实例变量
  • 实例之间共享一个静态变量。更具体地说,它与实例无关。你不想让它成为静态的。听起来你绝对想要的是让size 和实例变量,就像人们一直在说的那样。

标签: java eclipse class oop


【解决方案1】:

你可以这样看(简化):

静态变量是类范围的。如果为静态变量设置一个值,这意味着它适用于该类的所有过去、现在和当前实例。

另一方面,实例变量定义绑定到问题的一个特定实例的属性。

再次,通俗地说:

public class Person {
    public static int NUMBER_OF_EYES = 2;
    public int numberOfHealthyEyes;
}

假设所有人都有两只眼睛是合理的,这是所有人共有的特征。但是,个人(Person 的实例)可能有不同数量的健康眼睛。有些人可能是盲人,所以他们的数字会是 0,依此类推。

长话短说,当您需要描述类实例的内部状态的一部分时,您可以使用实例变量。当你想描述一个共享属性时,你可以使用静态的。

这里是 Oracle 页面上关于 Java 变量的链接:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html

【讨论】:

    【解决方案2】:

    也许我迟到了,但我只是想根据我的观点解释staticnon-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 将是静态的,因为所有学生(对象)的学校名称都相同,优点是它可以节省内存而不是将schoolName 创建为非每个对象都是静态的。另一方面,变量 studentName 将是非静态的,因为它对于 eact 对象会有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2020-11-21
      相关资源
      最近更新 更多