abstract class A {
    abstract void al();
    void a2() {
    }
}
 class B extends A {
    void al() {
    }
    void a2() {
    }
}
 class C extends B {
     void c1() { } 
 }
/////////////
A x = new B(); C y = new C(); A z = new C();
////下面哪四个调用是正确的,能给我讲讲为什么,我被Java的多态搞混了。
 x.a2();
 z.a2();
 z.c1();
 z.a1();
 y.c1();
 x.a1();
谢谢~!

解决方案 »

  1.   

     x.a2();
     z.a2();
     y.c1();
    以小弟来看只有3个正确  
    A x = new B(); C y = new C(); A z = new C();
    X Y Z 这3个实例分别是把自己实例化成 两个父对象 所以 只能调用 A对象 和C父对象的方法其他的都是错误的!
      

  2.   

    考查的是访问权限
    都是默认访问权限,只有在同一个包中,下面才会全部成立。
     x.a2();
     z.a2();
     z.c1();
     z.a1();
     y.c1();
     x.a1();
      

  3.   

    public,private,protected,friendly (默认)
    LZ把这四个的区别弄懂,问题自然就没了。这题目应该有一个前提,不在同一包中。
    x.a1(); // B类的a1()
    x.a2(); // B类的a2()
    y.c1(); // C类的c1()
    z.c1(); // C类的c1()
    这四个成立,因不在同一个包中,父类中的方法无法访问。只能访问本类中的方法。
      

  4.   

    题目是这么问的,是四个。
    按您的意思就是x.a2(); 
    z.a2();  z.a1();x.a1()这几个正确了。
      

  5.   

    跟椐上面回答:z.c1(); // C类的c1()不成立,A的引用找不到 c1()
      

  6.   

    x.a2();
    z.a2();
    y.c1();这3个正确
      

  7.   

    一楼的回答是正确的
    补充一点,就是静态类中的静态方法是给子类实现的,而不是给自己的引用来调用的
    所以x.a1();和z.a1();是错误的
      

  8.   

    你的代码可以sys out 看结果. 但是我觉得还是要理解为什么要用多态.下面这段是我个人所理解的多态..package mytest;public class TestPolyMorphic {

    private 动物 未知动物;

    public static void main(String args[]) {
    new TestPolyMorphic().test();
    }

    public void test() {
    未知动物 = new 动物();
    未知动物.吃什么();
    未知动物 = new 小牛();

    未知动物.吃();
    未知动物.跑();
    未知动物.吃什么();

    未知动物 = new 小兔();

    未知动物.吃();
    未知动物.跑();
    未知动物.吃什么();
    }
    }class 动物 {
    void 跑() {
    System.out.println("正在跑");
    }

    void 吃() {
    System.out.println("正在吃");
    }

    void 吃什么() {
    System.out.println("不知道");
    }
    }class 小牛 extends 动物 {

    void 吃什么() {
    System.out.println("吃草");
    }
    }class 小兔 extends 动物 {

    void 吃什么() {
    System.out.println("吃白菜");
    }
    }也许你会想为什么要这么写.. 如果不这么写我们自己要写跑和吃的方法..自己想想吧. 这只是简单的例子. 复杂的工程中很有用..
      

  9.   


    public class TestPolymorphism { abstract class A {
        abstract void al();
        void a2() {
         System.out.println("A.a2()");
        }
    }
     class B extends A {
        void al() {
         System.out.println("B.a1()");
        }
        void a2() {
         System.out.println("B.a2()");
        }
    }
     class C extends B {
         void c1() {
          System.out.println("C.c1()");
         } 
     }  public static void main(String[] args) {
     TestPolymorphism tp = new TestPolymorphism();
    A x = tp.new B();
    C y =tp.new C(); 
    A z = tp.new C();

     x.a2();
     x.al();
     
     z.a2();
    //  z.c1(); 不能编译
     z.al();
     
     y.c1();
    }
    }
    运行结果:
    B.a2()
    B.a1()
    B.a2()
    B.a1()
    C.c1()
      

  10.   

    lz不厚道,给的代码太具有欺骗性了
    上面的l其实是L不是1
    拷过来的代码编译3个出错
    自己写就错1个
      

  11.   

    正确的
    x.a2();
     z.a2();
     z.a1();
     y.c1();
     x.a1();错误的
     z.c1();你在eclipse里面把这些类敲一遍,如果有编译错误就说明有错误,然后自己想想为什么有错误。A x = new B();
    说明x是一个A对象,那么能访问的就是A的方法了。
    多态是指它的方法可以由多个子类去不同的实现,
    A的子类有多少,那什么它的抽象方法就被多个子类不同的实现,
    你声明的时候就可以指定一个具体的子类,外界只能看到A。
      

  12.   

    正确的 
    x.a2(); 
    z.a2(); 
    z.a1(); 
    y.c1(); 
    x.a1();
    如果A是B的父类那么:
    A a = new B(); 
    说明x是一个A对象,那么能访问的就是A的方法了。
    这种实例化方式叫做遮蔽,父类A将子类B的方法遮蔽了
    所以获得的实例化的引用只能访问父类A的方法
      

  13.   

    还有楼主给的代码有问题
    z.a1();你给成al();