黑马程序员技术交流社区

标题: 对a.fun1()的输出结果不是很理解,帮忙解释一下~~ [打印本页]

作者: 梁秋瑜    时间: 2013-5-25 21:59
标题: 对a.fun1()的输出结果不是很理解,帮忙解释一下~~
本帖最后由 梁秋瑜 于 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();
        }
}

作者: 棉/mg花/x糖    时间: 2013-5-25 22:09
本帖最后由 棉/mg花/x糖 于 2013-5-25 22:14 编辑

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

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

只要记住一点,对象都是引用类型,因此:
A a = b;
表示将a引用地址指向b,最后,a,b共用一块存储空间。

作者: 武志红    时间: 2013-5-25 22:26
这属于多态的一种体现 A是B的父类,定义父类A的一个对象a,a指向的是A的子类B的一个对象b,由于b是由继承了A的类B来定义的,b中含有A中所有方法。
b引用父类方法是可以实现的,即a.fun1()输出父类A中所定义的
作者: 秦兰之    时间: 2013-5-25 22:44
本帖最后由 秦兰之 于 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方法
    }
}

建议楼主还是多写写注释。我也是写完了就懂了。菜鸟云青年。
作者: 王靖远    时间: 2013-5-25 23:55
public class B extends A { 你这里不能用public 除非你给父类也加上public
b.fun1();很好理解。 a.fun1()就是多态的父类引用指向子类对象。
作者: 萧萧北    时间: 2013-5-28 17:18
楼上说的对啊,就是 对象时引用类型,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
  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. }
复制代码
解释在注释中





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