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
各位帮我解释一下吧,详细点啊

解决方案 »

  1.   

    父类方法 public int getAAA()被子类覆写了,只要创建的是子类对象,执行的将是子类被覆写的方法.
      

  2.   

    其实你不懂的就是为什么打出的不是222而是666.其他都懂是吧。
    主要是因为你重写了getAAA()这个方法。
    System.out.println( ((father)son).getAAA() );虽然向上转型成了father类型, 但是指向的还是son的对象。 所以还是会调用son重写的getAAA()方法。
      

  3.   

    “虽然向上转型成了father类型, 但是指向的还是son的对象”
    既然这样,那为什么System.out.println( ((father)son).aaa );
    打出的是 111而不是555呢?
    son和father里的aaa是什么关系?
      

  4.   


    father类中:
    public static final int aaa=555;son类继承后 aaa不会被重写(这是final的用处)
      

  5.   

    那么在son里面为什么可以给aaa重新赋值呢 public static final int aaa=555;
    难道son和father中的这两个 aaa 是没关系的,它们只是各自类中的一个变量而已,只不过名字一样而已???
      

  6.   

    aaa没有被覆盖,而getAAA被覆盖的原因。
      

  7.   

    我来解释 
    首先当你生成son实例的时候 按顺序 要先执行静态的属性声明 所以此时aaa=555  然后执行Son的构造方法  
    会调用父类的构造方法 , 此时也会执行父类的静态属性声明 aaa=111  但是  子类定义的aaa是final的 所以
    不可变  所谓还是555  其他的666什么的就是多态了  即使强转成了  父类  但还是子类的对象  调的方法也是子类覆盖了的方法 面向对象的思想  够清纯吧~~~
      

  8.   

    不清楚  照这么说  System.out.println( ((father)son).aaa ); 打出来的应该是555喽?但事实上却是111
      

  9.   

    你可以这样想: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。