gpt4 book ai didi

java - 在Java中,数组类型的字段是深复制还是浅复制?

转载 作者:行者123 更新时间:2023-12-03 05:36:31 24 4
gpt4 key购买 nike

[背景说明:我是一名具有 C++ 背景的新 Java 程序员,因此对 Java 中参数的传递方式有点困惑。]

在阅读和编写一些代码时,我遇到了以下情况

public class B{
int[] intArr;
Vector<String> strVec;

void mutator(){
// modifies intArr and strVec
}
}

public class A{
B bOfA;

A(B b){
bOfA = b;
}

void foo(){
bofA.mutator();
}
}
A 中的 foo() 肯定会修改 bOfA,但是传入的对象 b 呢?它的字段/数据成员也会被修改吗?

字段是浅复制还是深复制?

strVec 和 intArr 的处理方式是否不同,因为 strVec 是一个容器,而 inArr 是一个数组,它可能会实现为某种指针,因此根据浅复制还是深复制,其行为会有很大不同。

谢谢。

使用真实代码进行(后期)更新,结果有些令人惊讶(我假设按值传递机制以 C/C++ 方式解释):

import java.util.Vector;

public class B{
int[] intArr = null;
Vector<String> strVec = null;
int x = 0;
String s = null;

B(int sz){

x = 0;
s = new String("ini");

intArr = new int[sz];
strVec = new Vector<String>(sz);

for (int i=0; i<sz; i++){
intArr[i] = 0;
strVec.add( new String("xx") );
}
}

void mutator(){

x = -1;
s = new String("mute");

int sz = intArr.length;
strVec = new Vector<String>(sz);

for (int i=0; i<sz; i++){
intArr[i] = -1;
strVec.add( new String("aa") );
}
}
}


import java.util.Vector;

public class A{

B bOfA=null;

A(B b){
bOfA = b;
}

void foo(){
bOfA.mutator();
}
}



import java.util.Vector;

public class C{

public static void main(String[] args){
B b = new B(3);

A a = new A(b);

System.out.println("Contents of B before:");
System.out.println(b.x);
System.out.println(b.s);
for(int i=0; i<3; i++){
System.out.println(b.intArr[i]);
System.out.println(b.strVec.elementAt(i));
}

a.foo();

System.out.println("\n\nContents of A:");
System.out.println(a.bOfA.x);
System.out.println(a.bOfA.s);
for(int i=0; i<3; i++){
System.out.println(a.bOfA.intArr[i]);
System.out.println(a.bOfA.strVec.elementAt(i));
}
System.out.println("\n\nContents of B after:");
System.out.println(b.x);
System.out.println(b.s);
for(int i=0; i<3; i++){
System.out.println(b.intArr[i]);
System.out.println(b.strVec.elementAt(i));
}
}

}

cygwin 的结果:

Contents of B before:
0
ini
0
xx
0
xx
0
xx


Contents of A:
-1
mute
-1
aa
-1
aa
-1
aa


Contents of B after:
-1
mute
-1
aa
-1
aa
-1
aa

最佳答案

Java 按值传递一切。但是,对象的值是引用。

数组和 Vector 都是浅拷贝。

关于java - 在Java中,数组类型的字段是深复制还是浅复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com