黑马程序员技术交流社区
标题:
java代码小问题,求高手
[打印本页]
作者:
史卜坤
时间:
2012-6-28 08:32
标题:
java代码小问题,求高手
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[i]="@@"; else if(i==s1) Map[i]="A"; else if(i==s2) Map[i]="B"; System.out.print(Map[i]); } 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;为何?
作者:
王明明
时间:
2012-6-28 08:35
亲 先整理整理你的代码吧 看的费劲...
作者:
李文龙
时间:
2012-6-28 09:03
楼主的代码实在是太过缭乱,不过经我的整理,我便知道了楼主的问题,咱先看代码:
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
作者:
李文龙
时间:
2012-6-28 09:08
刚字体不对重发了一遍,而且一个地方打错了,请删除2楼的帖子,谢谢。
楼主的代码实在是太过缭乱,不过经我的整理,我便知道了楼主的问题,咱先看代码:
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
作者:
李文龙
时间:
2012-6-28 09:11
{:soso_e109:}为什么下面的字体还是错的,而且刚那地方原来不是我没改,是这个发帖一发出来就错了,那我把下面再发一次。莫非一不小心超过了长度限制,恳请版主注意这个问题
以上是经过我整理后的代码,红色地方就是楼主的问题所在,为何只有第一次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
作者:
李文龙
时间:
2012-6-28 09:15
{:soso_e136:}什么情况,我辛苦打的字,居然没变化,这。。。。。
请将原代码中的
Map=Mmap;
for(int i=0;i<Map.length;i++)
改为
for(int i=0;i<Mmap.length;i++)
{
Map[i]=Mmap[i];
}
for(int i=0;i<Mmap.length;i++)
作者:
李文龙
时间:
2012-6-28 09:19
{:soso_e121:}终于显示正常了,劳请楼主,看的时候,解释还是在上面有说明,就是代码的替换刚刚总算是成功显示正常了
作者:
叶久瑞
时间:
2012-6-28 09:27
很厉害啊
作者:
常佳杰
时间:
2012-6-28 11:51
想要重新给数组赋值应该用到循环..
下边是正确代码..看看吧
package com.heima.changjiajie;
public class Test6 {
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∷★∷
}
}
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重新赋值
for (int j = 0; j < Mmap.length; j++) {//
给数组赋值要用到循环语句根据下角标一个一个赋
值...
Map[j] = Mmap[j];
}
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");
}
作者:
李文龙
时间:
2012-6-28 12:08
常佳杰 发表于 2012-6-28 11:51
想要重新给数组赋值应该用到循环..
下边是正确代码..看看吧
package com.heima.changjiajie;
for (int i = 0; i < Map.length; i++)
这里得改, i<Mmap.length;不然,输出后边全是 null
作者:
常佳杰
时间:
2012-6-28 12:22
嗯是的..呵呵没注意.
因为要是写成
for (int i = 0; i < Map.length; i++)
的话就循环100次了..就会在遍历完数组后还循环..
导致出现null..
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2