class  A{
    void a(){
        System.out.println("parent'a()");
    }
}class  AA extends A{
    void a(){
        System.out.println("child'a()");
    }
}public static void main(String[] agrs){
    AA aa = new AA();
    aa.a();
    A a = (A)aa;
    a.a();
}这两种打印出来的结果都是一样的,怎么才能调用A中的a方法,在不改变 A 和AA的方法的情况下。

解决方案 »

  1.   

     A a = (A)aa;
    你的这个写法其实就是多态写法,运行的时候,还是AA,因为你重写的父类的方法,想调用父类的方法,你只有直接去new父类A a = new A();
      

  2.   

    其实我就是想知道怎么通过只类来访问已经被重写的方法!
    他的类型改变了为什么还是指向的是AA  没有指向A。
      

  3.   

    那的写法和
    A a = new AA();这样写没区别,多态
      

  4.   

     AA aa = new AA();既然你构造的是AA,那么就别再想着A了。
      

  5.   


    class AA extends A{
      void a(){
      System.out.println("child'a()");
      }
      void sa(){
      new A().a();
    }
    } a.sa();
      

  6.   

    想要调用A中的那个方法,必须要有那个对象的实例。A a = (A)aa;这样写,那个真正的对象还是AA,所以它就会调用AA中的那个方法。
      

  7.   

    你向上转型的时候,其实调用的方法是被子类覆写了的方法,也就是多态,你可以new 子类对象,如果用super.方法(),就可以了哈。
      

  8.   

    这个是子类调用父类,AA a =new A(),再调用就没问题了
      

  9.   

    子类调用父类中被重写过的方法,用super.被重写方法() 即可!
      

  10.   

    13楼正解,这个是java和c++一个很重要的区别,在c++中,可以通过这样向上提升的类型操作实现对父类行为的调用,而在Java中,无论对其进行什么样的类型转换,其类型实际上是不变的。举个简单的例子,C++中class A {
    public:
      void print(){
        cout<<"Class A"<<endl;
      }
    };class B: public A{
    public:
      void print(){
        cout<<"Class B"<<endl;
      }
    };int main(){
        B b;
        A a = (A)b;
        a.print();
        A *aa = new B();
        aa->print();
        cout<<typeid(a).name()<<endl;
        system("PAUSE");
        return 0;
    }
    输出的结果是Class A
    Class A
    1A说明通过类型提升b对象类型已经变成A类型。因此调用A中的行为,自然显现的是A的行为。但是这个在java中确实相反,请看以下代码:class Base{
    public String getFields(){
    return "Base";
    }
    }class Agg extends Base{
    public String getFields(){
    return "AGG";
    }
    public String getSuperFiedls(){
    return super.getFields();
    }
    }执行该代码
    Agg agg = new Agg();
    Base base = new Agg();
    if(base instanceof Agg)
    System.out.println("Class Agg");
    else
    System.out.println("Class Base");
    System.out.println(base.getFields());
    System.out.println(agg.getSuperFiedls());结果Class Agg
    AGG
    Base由此可将,无论将Java中的对象如何进行类型提升,依然保持其原有的类型。今天也是碰到这问题好好总结了一下,希望能够对看到的人有所帮助。
      

  11.   

    class  AA extends A{
        void a(){
    super.a();
            System.out.println("child'a()");
        }
    }