A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

©   米奇 中级黑马   /  2014-3-23 10:41  /  1399 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由   米奇 于 2014-3-23 16:38 编辑

  class A {
            void fun1() {
                      System.out.println(fun2());
                }
                int fun2() {
                        return 123;
                }
        }
         public class B extends A {
                int fun2() {
                         return 456;
                 }
              public static void main(String args[]) {
                        B b = new B();
                        b.fun1();
                        A a = b;
                        a.fun1();
                }
        }
分析下运行结果

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

6 个回复

正序浏览
hyace 中级黑马 2014-3-23 21:31:20
7#
⊙﹏⊙b汗,这是基础测试题吧,下面是我提交的:
  1. package com.itheima;

  2.   class A {   
  3.          void fun1() {
  4.                System.out.println(fun2());
  5.          }

  6.          int fun2() {
  7.                  return 123;
  8.          }
  9. }
  10.   
  11. //Test7继承于A
  12.   public class Test7 extends A {
  13.          int fun2() {
  14.                   return 456;
  15.           }

  16.          public static void main(String args[]) {
  17.                   //实例化Test7
  18.                  Test7 b = new Test7();
  19.                  //调用fun1()           
  20.                  b.fun1();
  21.                  //将b赋给父类实例a                 
  22.                  A a = b;
  23.                  a.fun1();
  24.          }
  25. }


  26. /**
  27. * 运行结果为: 456
  28. *              456
  29. * 在子类中重写了fun2,使调用fun1的时候打印456
  30. * main方法中的b.fun1打印456
  31. * a虽然是A类,但是指向b的地址,a.func1依旧是打印456。
  32. *
  33. */
复制代码
回复 使用道具 举报
我是这样回答得
  1. class A
  2. {
  3.      void fun1() //调用fun2
  4.      {
  5.              System.out.println(fun2());
  6.      }
  7.      int fun2()
  8.      {
  9.              return 123;
  10.      }
  11. }
  12. public class B extends A {//B继承A
  13.         //默认继承fun1  而且fun1 调用fun2都是本方法中的
  14.      int fun2()
  15.      {
  16.              return 456;//这里覆盖A中fun2方法
  17.      }
  18.      public static void main(String args[])
  19.      {
  20.              B b = new B();
  21.          b.fun1();//这里就输出456
  22.          A a = b;//多态,父类引用指向子类对象,将B提升为A类。
  23.          a.fun1();//这里就输出456
  24.      }
  25. }
复制代码
回复 使用道具 举报
都是456
第一个因为B类的fun2()覆盖了A类的方法,所以调用的是B的fun2()
第二个因为父类的引用指向子类,实际上调用的还是父类的fun2()
回复 使用道具 举报
运行结果:456 456

分析:B new 一个对象b,然而B继承了A类,当使用B的对象调用方法的时候,首先会查找B类中有没有此方法,如果没有,则到父类去查找此方法,如果有,则调用子身的成员方法。故b.fun1();的执行顺序:b.fun1()-->A.fun1()-->B.fun2();          接下来是将类B的引用传递给了类A,进行了类型提升,在调用a.fun1()
时,也会回到类B调用类B的fun2()方法     所以两次执行的结果都是一样的

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
B b = new B();
b.fun1();//456 子类继承父类方法,void fun1() {
                      System.out.println(fun2());//此处省略了 this.fun2()
                } 所以子类调用的时候,是b.fun2()
A a = b; //多态,父类引用指向子类对象,将b提升为A类。
a.fun1();//父类的引用指向的是b对象,即,b.fun1();

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报 1 0
结果为:456    456
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马