java - 多态性。复制数组的问题
问题描述
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 中的所有对象。
假设一个简单的类:
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 常量池。因此,修改一个字符串将产生一个带有结果的新字符串,而原始字符串保持不变。
推荐阅读
- scala - 如何确保火花作业正在利用所有可用资源(利用所有容器)
- c - 如何在C中将消息从服务器发送到客户端
- ios - Firebase 事务是否有内置的尝试限制
- kubernetes - 要求 Pod 以 noon-root 用户身份运行
- javascript - bootstrap-select 覆盖下拉样式
- grails - LDAP:错误代码 32 - 仅在第一次尝试时没有此类对象
- oracle - 如何在 oracle 中重用临时 lob
- c# - ASP.Net 4.6 任务等待不返回
- kotlin - 如何使用 Kotlin JVM(不是 android)和 Gradle 设置 Proguard
- cypress - 赛普拉斯忽略异常并停止执行,尽管声明了“Cypress.on("uncaught:exception", (err, runnable) => { return false; });"