比如下面的类m的输出结果是111,SS改成333输出就是333,程序好象并没有调用S511和F511的构造函数?那位能帮忙解释一下,谢过。
class F511{
private int ff=100;
protected int m=880;
F511()
{
m=add(8);}
int add(int i){return i+m;}
}
class S511 extends F511{
protected int ss=111;
S511(){m+=ss;}
int add(int i){return i*ss;}
}class A
{
    public static void main(String[] args) {
        S511 a = new S511() ;
        System.out.println(a.m );
        System.out.print(a.ss);}

解决方案 »

  1.   

    F511构造函数中调用add()是S511的add()方法,此时ss未初始,因此m = 0
      

  2.   

    还有一个问题比如有这么一个类,为什么我直接打印hm会调用Counter中的toString方法?我知道我前面已经向这个表中插入了这个类,但是我打印的时候并没有调用这个类里的方法啊(这里是toString),但为什么会被执行?import java.util.*;
    class Counter
    {
    int i=1; public String toString()
    {
    return Integer.toString(i);
    }
    }
    class Test
    {
    public static void main(String[] args)
    {
    HashMap hm=new HashMap();
    int c=0;
    for(int i=0;i<100;i++)
    {
    Integer r=new Integer((int)(Math.random()*10));
    if(hm.containsKey(r) )
    {

                              ((Counter)hm.get(r)).i++; }
    else
    hm.put(r,new Counter());
        c=1;
    }
    System.out.println(hm);
    }
    }
      

  3.   

    顺便说一下如果我在Counter里再添加一个方法比如叫ToStr()方法返回值和ToString一样,但是打印hm时,ToStr方法就没有被执行,只执行了ToString方法。