解决方案 »

  1.   

    Quote: 引用 1 楼 u010015186 的回复:

    quote]
    public class Test9
    {
    public static void main(String[] args)
    {
    AA a = new BB();
    a.show('j');
    }
    }
    class AA
    {
    public void show(int a)
    {
    System.out.println("int a = "+a);
    }
    }class BB extends AA
    {
    public void show(char a)
    {
    System.out.println("char a ="+a);
    }
    }
    嗯,第二种我把它和多态混淆了!
    那这个呢?为什么输出的是:
    int a = 106
      

  2.   

    sorry,看来是我的理解有问题,这样看来,第2种解释应该是对了。
      

  3.   

    这个代码真的很有趣,我试着写一下
    public class Test9
    {
    public static void main(String[] args)
    {
    AA b = new BB();
    b.show();
    b.show('j');
    }
    }
    class BB extends AA
    {
    public void show(char a)
    {
    System.out.println("char a =" + a);
    }
    public void show() {
    System.out.println("char a = null");
    }
    }class AA
    {
    public void show(int a)
    {
    System.out.println("int a = " + a);
    }
    }
    上面的代码是错的,原因是 “尽管多态是在编译时确定对象的类型,但在编译时,还是根据父类的方法声明进行程序检查。因此,如果子类中定义的方法,在父类中没有定义,则会出项编译错误。”按照这个思路,楼主你可以理解下,其实你在 BB 这个子类写的 show 方法其实编译是过不了的,因为父类 AA 中没定义(方法名和参数没有完全一样,即重写),编译器没出错的原因我猜是你的方法名跟父类的方法名一样。
      

  4.   

    你的理解没错,是这个代码实际上编译出错了编译没有问题,AA中定义了方法,你传char过去是没问题的,可以向上转型。
    public void show(int a)
        {
            System.out.println("int a = " + a);
        }
      

  5.   

    你的理解没错,是这个代码实际上编译出错了编译没有问题,AA中定义了方法,你传char过去是没问题的,可以向上转型。
    public void show(int a)
        {
            System.out.println("int a = " + a);
        }
    是自动向上转型了吗?但找到子类的char方法后,还要去父类寻找这个向上转型的方法吗?谢谢!
      

  6.   

    是的,这种的确是编译不了,但上面这个程序为什么会输出:int a = 106
    还有我的那个第一个问题,是(1)正确不?
      

  7.   

    按照这个解释,2)先从父类开始寻找,如果找不到,直接报错;如果找到,然后再去子类寻找,若方法被重写,则调用子类的方法,否则,调用父类的方法a; 应该就是这么做的,先去父类找,a.show('j');去A类中找到了show(int a)方法,然后向上转型了,就调用了这个方法。
    这也就解释了为什么4楼举的那个列子了,b.show()方法在父类AA中没有定义,所以直接报编译错误了。
     AA b = new BB();
     b.show();
     b.show('j');
      

  8.   

    想了一下,应该是这样了,感谢楼主分享这么好的一个问题,我都被绕进去了当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
    如果有,再去调用子类的该同名方法。
    楼主看下博客文章吧http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html
      

  9.   

    http://developer.51cto.com/art/200906/130414.htm想知道这个页面的第八个结果是怎么出来的?
      

  10.   

    public class Test1
    {
    public static void main(String[] args)
    {
    Fc fc = new Zc();
    Dc dc = new Dc();
    fc.m(dc);
    }
    }class Fc
    {
    public void m(Dc dc)
    {
    System.out.println("Dc = ");
    }
    public void a()
    {
    System.out.println("Fc:");
    }
    }class Zc extends Fc
    {
    public void a()
    {
    System.out.println("Zc:");
    }
    }class Dc
    {

    }那这种情况呢?