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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 梁秋瑜 于 2013-5-28 20:15 编辑

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();
        }
}

6 个回复

倒序浏览
本帖最后由 棉/mg花/x糖 于 2013-5-25 22:14 编辑

楼主,你想问的是什么啊?

是不是对最后结果a.fun1()和b.fun1()相同不理解啊?

只要记住一点,对象都是引用类型,因此:
A a = b;
表示将a引用地址指向b,最后,a,b共用一块存储空间。
回复 使用道具 举报
这属于多态的一种体现 A是B的父类,定义父类A的一个对象a,a指向的是A的子类B的一个对象b,由于b是由继承了A的类B来定义的,b中含有A中所有方法。
b引用父类方法是可以实现的,即a.fun1()输出父类A中所定义的
回复 使用道具 举报
本帖最后由 秦兰之 于 2013-5-25 22:53 编辑

public  class A
{
         void fun1()                 //3,fun1方法返回的是一个空参数,只输出fun2方法的值,此时已被B类fun2方法覆盖,所以A类中的fun2方法没有执行。
         {
         System.out.println(fun2());
         }

int fun2()
        {
         return 123;
        }
   
}

public class B extends A {                 //1,B类继承A类并覆盖A类。
    int fun2()                                  //2,此时B类的 fun2方法覆盖了A类的fun2方法,fun2方法的返回值是456。
    {
            return 456;
    }

    public static void main(String args[]) {
            B b = new B();                        //在B类中自定义一个对象。
            b.fun1();                                 //调用覆盖后的fun1方法。
            A a = b;                                 //将b类对象的值赋值给A类对象 。
            a.fun1();                                 //a也是调用覆盖后的fun1方法
    }
}

建议楼主还是多写写注释。我也是写完了就懂了。菜鸟云青年。
回复 使用道具 举报
public class B extends A { 你这里不能用public 除非你给父类也加上public
b.fun1();很好理解。 a.fun1()就是多态的父类引用指向子类对象。
回复 使用道具 举报
楼上说的对啊,就是 对象时引用类型,new 一个新对象则在堆内存分配一个内存空间,你的代码中:
  1. public static void main(String args[]) {
  2. B b = new B();
  3. b.fun1();
  4. A a = b;
  5. a.fun1();
  6. }
复制代码
只有 B b = new B();  则在内存中分配了一个内存空间,b对象是指向 new B() 的内存地址
而 A a = b;  此处把b对象指向的内存地址分配给了a,所以a对象是指向的也是 new B() 的内存地址,
所以最后两个输出结果就是一样的了

回复 使用道具 举报
王瀛 高级黑马 2013-5-28 17:39:57
7#
  1. class A {
  2.         void fun1() {
  3.                 System.out.println(fun2());
  4.         }

  5.         int fun2() {
  6.                 return 123;
  7.         }
  8. }

  9. public class B extends A {
  10.         int fun2() {
  11.                 return 456;
  12.         }

  13.         public static void main(String args[]) {
  14.                 B b = new B();//创建子类对象,b指向这个对象,其中b复写了父类的fun2方法
  15.                 b.fun1();//调用对象fun1()方法,fun1是B从父类继承来的,调用的fun2是复写后的fun2
  16.                 A a = b;//父类的引用指向了子类的对象,多态的体现,注意a和b都是引用变量,他们仅仅是引用类型不同,但是只想的是同一个对象。
  17.                 a.fun1();//由于指向的是同一个对象,所以打印出来的结果也是一样的
  18.         }
  19. }
复制代码
解释在注释中
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马