【问题标题】:Java changing size of array objectsJava改变数组对象的大小
【发布时间】:2022-01-01 10:25:20
【问题描述】:

假设我创建了一个大小为 1 的对象数组(动物),但后来我调用了一个函数,该函数返回一个大小为 5 的对象数组。会发生什么,动物现在将变成一个由 5 个对象组成的数组,或者它会给我一些错误吗?

Animal[] animals = new Animal[1];

animals[0] = new Animal();

animals = createAnimals();

【问题讨论】:

  • 你尝试的时候发生了什么?
  • "animals" 是对某个数组对象的引用,由new Animal[1] 创建。如果您更改引用(例如,通过对同一变量执行另一个“新”操作),则“动物”将引用不同的对象。此外,如果没有任何其他对原始“Animal[]”数组对象的活动引用,那么它将有资格进行垃圾回收。

标签: java arrays oop


【解决方案1】:

它会起作用的。数组变量不指定数组有多大。所以你绝对可以将 animals 重新分配给 createAnimals 方法的结果。

【讨论】:

  • 您说得对,OP“绝对可以将动物重新分配给 createAnimals 方法的结果”。但是,这将覆盖对 ORIGINAL 对象的引用。 OP 需要知道他可能会丢失他可能写入原始数组的任何内容,除非他将引用复制到不同的变量。
【解决方案2】:

Java 改变数组对象的大小

不。这根本不是你在这里所做的。

Animal[] animals = new Animal[1];

这做了 3 件不相关的事情:

Animal[] animals;
new Animal[1];
animals = whatever the previous thing returned.
  1. 这会产生一个名为animals 的变量。变量就像有标题的便利贴,你可以在上面写地址。

  2. 这会生成一个大小为 1 的新数组。数组就像房子。他们没有名字,但他们有一些地址。

  3. 这会将您刚刚建造的房子的地址写在您的便利贴上。

当您运行animals = createAnimals() 时,createAnimals() 会返回一个地址。不是房子 - 房子的地址。你不能用java归还房子;这根本不可能。所有变量都是引用或原语(这是一些数字类型的硬编码列表,没什么复杂的,都是固定大小的概念)。 animals = createAnimals() 只是擦掉你的 postit(它是用铅笔写的),然后在上面写下那个地址。

所以,如果createAnimals 的代码如下:

Animals[] newArr = new Animals[5];
return newArr;

然后该方法构建了一个全新的(更大的)房子并返回了它的地址,而不是你的 postit 导致另一个房子。原来的房子还在。原来的房子现在和永远都是 1 号,因为 java 数组不能调整大小。但是数组引用(上面有地址的帖子)可以被清除,并且可以在上面写入新地址。

那么,房子?它们不会神奇地改变大小。但是在 em 上有铅笔标记的 postits?你今天可以运行这个概念:“从 postit 中读取地址,上车,开车,测量你在那个地址找到的房子”,明天你可能会得到不同的结果:那是因为有人在postit,不是因为有人在仙境屋发明了魔法爱丽丝。

如果你想在 java 中创建一个新对象,某个地方的某个人需要调用 new 来创建一个。在这里,让我们看看它的实际效果:

Animal[] a = new Animal[1];
a[0] = new Dog();
Animal[] b = a;
a[0] = new Cat();
System.out.println(a[0].makeNoise());

这将打印 miauw。那是因为只有一所房子(只有一个数组)和两个 postit,每个都有相同的地址。我们只是用b = a;指令复制了地址,我们没有盖新房子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2014-11-06
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多