黑马程序员技术交流社区

标题: 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