当前位置: 代码迷 >> J2SE >> 帮小弟我看一上运行结果
  详细解决方案

帮小弟我看一上运行结果

热度:6121   发布时间:2013-02-25 00:00:00.0
帮我看一下运行结果
Java code
public class Son extends father {       public static final int aaa=555;    public Son(){                super();    }    public int getAAA(){                    return 666;    }        public static void main(String[] args) {        Son son=new Son();        System.out.println(son.aaa);        System.out.println(son.getAAA());        System.out.println( ((father)son).aaa );        System.out.println( ((father)son).getAAA() );    }}class father{        public static final int aaa=111;        public father(){        System.out.println(aaa);        System.out.println(getAAA());    }        public int getAAA(){                return 222;    }}

结果是:
111
666
555
666
111
666
我怎么觉得应该是:
111
222
555
666
111
222
各位帮我解释一下吧,详细点啊

------解决方案--------------------------------------------------------
你可以这样想:Son son=new Son();这句先会生成一个son的域。由于aaa是static final,当域生成的时候,aaa也就固定值了。然后son的构造函数指向其父类,则会去寻找一个father的域,由于father中aaa也是static final,不能覆盖,所以,这个域中也有aaa,而getAAA已经被覆盖,所以,域中没有。当运行super(),也就是father()时,
public father(){
System.out.println(aaa);
System.out.println(getAAA());
}
aaa和getAAA都会首先在fathor函数所在域中寻找,如果有,直接调用,如果没有,则会调用子类重构的函数。所以,第一句出来的是111,而第二句则出来666。
然后:
System.out.println(son.aaa);
System.out.println(son.getAAA());
System.out.println( ((father)son).aaa );
System.out.println( ((father)son).getAAA() );

son.aaa和son.getAAA()不用说,是输出son的域中的aaa和son.getAAA(),所以是555和666;
而((father)son).aaa和((father)son).getAAA() 则会指向father的域,则aaa是调用的fathor域中的aaa,输出111,getAAA()由于fathor域中没有,则会调用son中的getAAA(),输出666。
  相关解决方案