楼主的代码实在是太过缭乱,不过经我的整理,我便知道了楼主的问题,咱先看代码:
public class ll
{
//原始数组
String Mmap[]={"∷","∷","∷","∷","∷","★","◎", "∷","∷","■","∷","∷","∷","★","∷","∷","∷","★","∷"};
//新建数组
String Map[]=new String[100];
int s1;
int s2;
//带参数方法,改变特定下标位置的值
public void showmap(int st1,int st2)
{
this.s1=st1;
this.s2=st2;
//每次给Map重新赋值
Map=Mmap;
for(int i=0;i<Map.length;i++)
{
if(i==s1&&i==s2)
Map="@@";
else if(i==s1)
Map="A";
else if(i==s2)
Map="B";
System.out.print(Map);
}
System.out.println("\n");
}
//程序入口
public static void main(String[] args)
{
ll l=new ll();
l.showmap(5, 6); //第1次输出:输出显示结果:∷∷∷∷∷AB∷∷■∷∷∷★∷∷∷★∷
l.showmap(8, 8); //第2次输出:输出显示结果:∷∷∷∷∷AB∷@@■∷∷∷★∷∷∷★∷
l.showmap(12, 15); //第3次输出:输出显示结果:∷∷∷∷∷AB∷@@■∷∷A★∷B∷★∷
}
}
//为何只有第一次Map得到Mmap的值,以后Map的值不变?就像未执行Map=Mmap;为何?
以上是经过我整理后的代码,红色地方就是楼主的问题所在,为何只有第一次Map得到Mmap的值呢,这是因为 Map=Mmap 表示将 Mmap 数组的首地址赋值给 Map,而不是楼主你所想的重新赋值, Mmap将首地址赋值给Map后,Map相当于是 Mmap 的一个引用,那么你下边的改变值的操作,实质上相当于是在改变 Mmap 本身。
如果想要得到你所想的改变,那么请将
Map=Mmap;
for(int i=0;i<Map.length;i++)
代码替换为如下代码
for(int i=0;i<Mmap.length;i++)
{
Map=Mmap; //这里才算是重新赋值,你可以返回Map 和 Mmap 的地址值,你会发现,它们所处的内存空间地址值并不相同
}
for(int i=0;i<Mmap.length;i++)
//特别注意里面循环终止条件得是 i<Mmap.length ,你的原程序中是 i<Map.length ,因为你之前的赋值操作,所以这个长度没问题.
//但是改为我的重新赋值操后, Map.length 的值可是等于100的,因为你为其开辟的是有100个数据的,所以得要改为 i<Mmap.length |