两个新创建的对象似乎引用了相同的地址

时间:2018-08-07 00:22:59

标签: java

我只用Java编程了几个月,所以我对Java没有那么的经验(尽管我应该了解一些技巧和基本知识)。

我遇到了一个显而易见的问题,但我看不到。

"_"

这是我的代码的一部分。

这怎么可能是真的?这是两个单独的对象。我不明白。

在我的main方法中直接调用foo方法(出于测试目的)。

如果您需要LabelText的构造函数,则为:

public class SomeClass {
   private final int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

   private LabelText AText = new LabelText('A', numbers);
   private LabelText BText = new LabelText('B', numbers);

   public void foo() {
       AText.numbers[6] = -1;
       BText.numbers[3] = -1;
       if (BText.numbers[6] == -1) System.out.println("Wtf?");
   }
}

2 个答案:

答案 0 :(得分:15)

因为您是在没有复制的情况下将引用传递给numbers,所以两个对象最终都指向相同的 int[] 实例。虽然有两个不同外部对象,但它们都指向的内部对象是同一对象,因此您可以通过取消引用{{1}中的任何一个来更改该内部对象}和AText.numbers,并且访问两个外部对象的BText.numbers字段时,更改将在两个外部对象中可见。

您可以检查numbers将返回AText == BText,但是false将返回AText.numbers == BText.numbers。并且true也将返回this.numbers == AText.numbers

就像尝试使用相同的代码,但使用以下构造函数:

true

答案 1 :(得分:4)

Java中的对象刷新:

在Java编程语言中,有两种数据类型:基本和引用。

  • 原语:char,byte,short,int,long,float和double
  • 参考:Java和数组中的所有对象。

示例Java对象:

  • 在Java编程语言中,存在诸如String之类的类, ExceptionIntegerFile。使用以下方法创建对象 类。另外,可以创建自定义类和对象- 例如PersonLabelText

如下创建Java对象。如果Person是课程:

public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void setName(String s) {
        name = s;
    }
    public String getName() {
        return name;
    }
    public void setAge(int i) {
        age = i;
    }
    public int getAge() {
        return age;
    }
}

考虑代码:

Person personA = new Person("A", 32);

在上面的语句中,Person是一个类,personA是一个变量,new Person(..)创建一个类型为Person的对象。 =将新创建的Person对象分配给变量personApersonA是引用类型的变量,它指向或引用新创建的Person对象。

Person类具有属性nameage。这些代表对象的状态。通常,状态在对象之间有所区别。

此引用类型的行为如何?请参见以下示例代码:

public class TestingReferences {
    public void foo() {
        Person a = new Person("A", 32); // 1
        Person b = new Person("B", 28); // 2
        Person c = a; // 3
        a.setName("X"); // 4
        System.out.println("Are the names of a and c equal? " +
                a.getName().equals(c.getName())); // 5
        }
    }
    public static void main(String [] args) {
        TestingReferences app = new TestingReferences();
        app.foo();
    }
}

在上面的示例代码中,注意在方法foo()中打印的输出-人 a c 都具有相同的名字 X < / em>。这是怎么发生的?

1:Person a = new Person("A", 32);将创建一个新的人物对象并将其分配给变量a
2:Person b = new Person("B", 28);将创建一个新的person对象并将其分配给变量b
3:Person c = a;创建了一个人变量c,并且为它分配了参考变量a。在此阶段,参考变量ac都指向或引用同一个人对象(请参见下图)。
4:a.setName("X");人员对象a的{​​{1}}从“ A”更改为“ X”。
5:name打印System.out.println("Are the names of a and c equal? " + a.getName().equals(c.getName()));

由于两个引用变量truea都指向同一个对象,因此两个引用都可以看到对象状态的任何变化。

如果将语句添加到cfoo,则c.setAge(44);age的人的a都设置为44。

enter image description here

上面的示例演示了对象引用在Java编程语言中的行为。这篇文章中的问题也是如此。


来自帖子的问题:

请注意,原始数组(如c)和对象数组(int[])的数组都是对象。

1:Person[]
2:private final int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
3:private LabelText AText = new LabelText('A', numbers);

以上三个语句中有三个对象和引用变量。请注意,private LabelText BText = new LabelText('B', numbers);对象引用已分配给numbersAText的状态。 BText数组的所有这三个引用都指向在第1行中创建的同一数组对象。现在,在方法numbers中:

foo()

将此语句添加到方法AText.numbers[6] = -1; BText.numbers[3] = -1; (BText.numbers[6] == -1) ... returns true -and- (AText.numbers[3] == -1) ... also, returns true. 中:foo 打印:System.out.println(java.util.Arrays.toString(numbers));。请注意位置 3 6 中的数组值。