黑马程序员技术交流社区

标题: 这段代码的流程谁给祥细说下 [打印本页]

作者: 何伟    时间: 2012-12-25 18:59
标题: 这段代码的流程谁给祥细说下
class A {
  void fun1() {
    System.out.println(fun2());
  }
  int fun2() {
    return 123;
  }
}
class B extends A {
  int fun2() {
    return 456;
  }
  public static void main(String[] args) {
    A a;
    B b = new B();
        b.fun1();
    a = b;
        a.fun1();
  }
}


为什么打印的结果是两个456呢?
作者: 高境    时间: 2012-12-25 19:15
首先,b.fun1();调用的是子类B里面的fun1(),这个fun1是继承自父类A类,
然后,a=b;相当于A a = new B();这里用到了多态,父类引用指向子类对象,所以,当调用a.fun1();调用的是子类对象里面的fun1()。
作者: 李敬卫    时间: 2012-12-25 19:21
子类复写父类的fun2(),之后子类的对象b调用fun1()方法输出复写后的方法,结果返回456,然后对象b赋值给父类的对象a,所以现在可以把a看作是b,当然也就返回456
作者: 一帆风顺    时间: 2012-12-25 19:29


已经明确标注了

作者: Rancho_Gump    时间: 2012-12-25 19:41
这里有个重点就是:B的fun2()方法复写了A的fun2()方法
当B继承A时相当于B有了A的两个方法,但B对fun2()进行了复写,在用B的对象调用fun2()时,执行复写后的方法,即B的方法。若用A的对象调用则执行A的方法。
  public static void main(String[] args) {
    A a;
    B b = new B();
        b.fun1();
    a = b;//此处是多态,相当于A a = new B();  调用时执行B的fun2()方法
        a.fun1();
    a = new A();
         a.fun1();//此处打印结果是:123

  }

作者: 何创    时间: 2012-12-25 20:19
哈哈  楼上的几位 都把我想说的已经说完了   就是楼上几位哥们说的那个意思、
不过 我还是想说说 楼主  我个人觉得  在类的继承 和 面向对象的三个特性 尤其是多态那一章的视频 你应该再多看看几遍
我觉得对于多态的理解 你不是很透彻 所以导致叫你的题目 不清楚   你说对吗? 呵呵~
作者: 何伟    时间: 2012-12-25 21:04
我一直以为a.fun1打印的是123,原来a和b都 是指向同一实体
作者: 黄锦成    时间: 2012-12-25 23:33
class A {
        void fun1() {
                System.out.println(fun2());
        }

        int fun2() {
                return 123;
        }
}

class B extends A {
        int fun2() {
                return 456;
        }

        public static void main(String[] args) {
                A a;
                B b = new B();
                b.fun1();//打印456
                a = b;//相当于A a = new B();运行时看子类,编译时看父类
                a.fun1();//456,在fun1中调用了fun2,父类中的fun2被子类重写了
        }
}

作者: 黑马-邢广耀    时间: 2012-12-26 09:42
class A {
  void fun1() {
    System.out.println(fun2());
  }
  int fun2() {
    return 123;
  }
}
class B extends A
{
  int fun2()
{
    return 456;
  }
  public static void main(String[] args)
{
    A a;
    B b = new B();
    b.fun1();//B是A的子类,调用fun1()方法,方法中涉及到fun2(),子类覆写父类,所以答案是456
    a = b;//涉及到多态  A a=new B();父类的引用指向子类对象,运行时看右边,编译时看左边
    a.fun1();
  }
}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2