以下是两段简单的代码,但有几个地方不是很懂,请帮忙解释下,谢谢~~~~第一段:
import java.util.Random;public class MagicHat{
static int maxRabbits = 5;
static Random select = new Random();public MagicHat(String hatName){
this.hatName = hatName;
  rabbits = new Rabbit[1 + select.nextInt(maxRabbits)];
 
  for(int i = 0; i <rabbits.length; i++){
  rabbits[i] = new Rabbit();
  }
}public String toString(){  //问题标签
String hatString = "\n" + hatName + " contains:\n";for(Rabbit rabbit : rabbits){   //问题标签
hatString += "  " + rabbit;
}
return hatString;
}
private String hatName;
private Rabbit rabbits[];static class Rabbit{
static private String[] rabbitNames = {"Floppsy", "Moppsy", "Gnasher", "Thumper"};
static private int[] rabbitNamesCount = new int[rabbitNames.length];
private String name;public Rabbit(){
int index = select.nextInt(rabbitNames.length);
name =  rabbitNames[index] + (++rabbitNamesCount[index]); //问题标签
}public String toString(){
return name;
}
}
}第二段:
public class TryNestedClass{
static public void main(String[] args){
System.out.println(new MagicHat("Gray Topper")); 
System.out.println(new MagicHat("Black Topper"));
System.out.println(new MagicHat("Baseball Cap"));
}
}问题1:
(++rabbitNamesCount[index]) 这里的 rabbitNamesCount[index]仅仅只是一个数组,而且还是一个没有数据的数组,它是怎么
能显示出一个数字来的?难道是 toString() 方法将 index 索引值转换成了数字(或者转换它的下标?)??那真神奇,电脑是怎么去
转换这东西的? 问题2:
for(Rabbit rabbit : rabbits){//Rabbit是嵌套的类。rabbit这里是Rabbit的类变量。rabbits是个只有元素数,没有实际数据的数组
hatString += "  " + rabbit; //这个不是应该根据rabbits的数组元素来,决定循环的次数的吗?但是结果是每次调用,只循环了一次。
问题3:
这段代码中,最后通过toString来显示类对象,它在哪里被调用了?问题4:
整段代码要显示嵌套类的内容,但是我却不知道在哪里调用了嵌套类Rabbit,难道是上面的for循环??为什么呢?

解决方案 »

  1.   

    它是一个int型的数组,对于int型的变量会自动初始化为0这个我懒得看代码了,如果只循环一次那就说明这个rabbits里面的确只有一个元素啦。问题2: 
    for(Rabbit rabbit : rabbits){//Rabbit是嵌套的类。rabbit这里是Rabbit的类变量。rabbits是个只有元素数,没有实际数据的数组 
    hatString += "  " + rabbit; //这个不是应该根据rabbits的数组元素来,决定循环的次数的吗?但是结果是每次调用,只循环了一次。 
    } toString方法是隐式调用的,通常情况下只要是将该对象与字符串进行操作的话(例如:"+",System.out.Println()等等)时,会自动调用toString方法它是一个静态的内部类,你要清楚类的初始化顺序
      

  2.   

    感谢楼上的回答,可是我还是有些疑问。关于问题1(++rabbitNamesCount[index])
    我没有看到过楼上说的这方面知识,能不能在详细点介绍下
    int类型会先将自己初试化为0,然后再将=号后面的值赋予变量,是这样子伐??
    那么对于数组呢?变量拥有的仅仅只是引用而已,它又怎么把它变成数字的呢??关于问题3 toString()
    楼上的也说了,是作为运算符操作数时自动调用的吧,可是第二段代码中,哪来的运算符?
      

  3.   

    是将数组的所有值都初始化为0println()打印时会调用toString()
      

  4.   

    哦~原来是所有数组元素都初始化为0,那就对了,通过index索引调出其中一个元素,然后自加1那请问,其他的问题呢??