首页 > 解决方案 > 多态性。复制数组的问题

问题描述

Empleado[] empleados = new Empleado[3];
empleados[0] = new Empleado("Alfredo", 20000, 2020, 6, 01);
empleados[1] = new Empleado("Alejandro", 21000, 2020, 7, 04);
empleados[2] = new Jefatura("Laura", 25000, 2010, 3, 6);
Jefatura jefeRRHH = (Jefatura) empleados[3]; // CASTEO
jefeRRHH.setIncentivo(1000);

为什么当我为 jefeRRHH 设置激励时,empleados[2] 会改变?我认为如果修改了 jefeRRHH,这不会影响数组 empleados。

我的意思是,当我使用 foreach 循环遍历向量时,empleados[2] 将应用激励返回给我。

package poo;

public class test {

    public static void main(String[] args) {
        
        
        String Nombre = "José";
        int j = 1;
        
        String[] nombres = new String[1];
        nombres[0] = Nombre;
        
        int a = j;
        
        Nombre= "Maria";
        
        System.out.println(Nombre);
        System.out.println(nombres[0]);
        
        j=2;
        
        System.out.println(j);
        System.out.println(a);

    }

}

为什么这里不一样?

当我声明新变量时,我不是在分配地址,而是在分配副本,对吗?

标签: java

解决方案


以下内容适用于 Java 中的所有对象。

假设一个简单的类:

public class Foo {

}

当你实例化一个 class 的对象时Foo,你实际上会在堆上分配内存,构造一个 Foo-Object 并检索到该位置的地址,然后将其存储在 object 变量中:

Foo f = new Foo(); // f points to a Foo-Object

因此,不是复制实际对象,而是复制引用......

Foo farr[] = new Foo[1]; // create array with a capacity of 1
Foo f = new Foo(); // f now holds the adress to an actual Foo-Object
farr[0] = f; // farr[0] now holds the adress to the SAME Foo-Object

这是一篇关于引用和对象的好文章
, 这是一个很好的答案作为后续阅读


此外,还有原始数据类型和字符串文字。

无论发生什么,原始数据类型总是被简单地复制。所以永远不会出现这样的情况,你改变一个原始变量而另一个改变。

另一方面,字符串有点棘手。它们是包裹在 a 周围的对象char[],因此(正如其他人在这里已经说明的那样)是不可变的并共享一个所谓的 String 常量池。因此,修改一个字符串将产生一个带有结果的新字符串,而原始字符串保持不变。


推荐阅读