A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-6-28 08:32  /  2643 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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;为何?

10 个回复

倒序浏览
亲 先整理整理你的代码吧 看的费劲...
回复 使用道具 举报
楼主的代码实在是太过缭乱,不过经我的整理,我便知道了楼主的问题,咱先看代码:
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

评分

参与人数 1技术分 +3 收起 理由
刘蕴学 + 3 恭喜技术分达标

查看全部评分

回复 使用道具 举报
刚字体不对重发了一遍,而且一个地方打错了,请删除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
回复 使用道具 举报
{: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
回复 使用道具 举报
{: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++)
回复 使用道具 举报
{:soso_e121:}终于显示正常了,劳请楼主,看的时候,解释还是在上面有说明,就是代码的替换刚刚总算是成功显示正常了
回复 使用道具 举报
很厉害啊
回复 使用道具 举报
想要重新给数组赋值应该用到循环..
下边是正确代码..看看吧
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");

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1 赞一个!

查看全部评分

回复 使用道具 举报
常佳杰 发表于 2012-6-28 11:51
想要重新给数组赋值应该用到循环..
下边是正确代码..看看吧
package com.heima.changjiajie;

for (int i = 0; i < Map.length; i++)
这里得改,  i<Mmap.length;不然,输出后边全是 null
回复 使用道具 举报
嗯是的..呵呵没注意.
因为要是写成
for (int i = 0; i < Map.length; i++)
的话就循环100次了..就会在遍历完数组后还循环..
导致出现null..
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马