黑马程序员技术交流社区

标题: 多态方法调用 [打印本页]

作者: 蛤蟆太康    时间: 2014-5-3 21:35
标题: 多态方法调用
  1. 断点调试过了,还是没搞清楚为什么结果会是“爱你”,方法调用的步骤能猜到,但是就是不知道原理为什么,求大神指教!!!
复制代码


作者: 张然龙    时间: 2014-5-3 22:02
本帖最后由 张然龙 于 2014-5-3 22:04 编辑

你的代码没有贴清楚 ,我刚刚在别人的帖子里帮人解答过什么是多态 ,写的也不是太好,你试着理解下吧!

首先 多态的特性就是父类引用指向子类对象。当子类对象覆盖了父类中的方法时,利用多态特性,可以调用子类中覆盖后的方法,  而成员变量不会被覆盖!

根据传入不同的子类,调用相同的函数,从而调用不同的代码,这就是多态


详细请看注释  代码如下↓

  1. class A
  2. {
  3.         int num=1;
  4.         public static void show()
  5.         {
  6.                 System.out.println("父类静态show");
  7.         }
  8.         public void show1()
  9.         {
  10.                 System.out.println("父类show");
  11.         }
  12. }
  13. class B extends A
  14. {
  15.         int num=2;
  16.         public static void show()
  17.         {
  18.                 System.out.println("B子类静态show");
  19.         }
  20.         public void show1()
  21.         {
  22.                 System.out.println("B子类show");
  23.         }
  24. }
  25. class C extends A
  26. {
  27.         int num=3;
  28.         public static void show()
  29.         {
  30.                 System.out.println("C子类静态show");
  31.         }
  32.         public void show1()
  33.         {
  34.                 System.out.println("C子类show");
  35.         }
  36. }
  37. class Show
  38. {
  39.         public static void method(A a)
  40.         {
  41.                 a.show();
  42.                 a.show1();
  43.         }
  44. }
  45. class Demo3
  46. {
  47.         public static void main (String args[])
  48.         {
  49.                 A d=new B();
  50.                 System.out.println(d.num);//多态不能覆盖父类中的成员变量!毕老师说了变量看左边的,方法看右边覆盖后的!
  51.                 Show.method(new B());//根据传入不同的子类,调用相同的函数,从而调用不同的代码,这就是多态
  52.                 Show.method(new C());
  53.         }
  54. }
复制代码


作者: 蛤蟆太康    时间: 2014-5-3 23:20
张然龙 发表于 2014-5-3 22:02
你的代码没有贴清楚 ,我刚刚在别人的帖子里帮人解答过什么是多态 ,写的也不是太好,你试着理解下吧!

...

不好意思,第一次发帖,代码是复制上去的,竟然没显示出来,下面是代码,请看一下。class A
{
        public void show()
        {
                show2();
        }
       
        public void show2()
        {
                System.out.println("我");
        }
}
class B extends A
{
        public void show2()
        {
                System.out.println("爱");
        }
}
class C extends B
{
        public void show()
        {
                super.show();
        }
       
        public void show2()
        {
                System.out.println("你");
        }
}

public class Test
{
        public static void main(String[] args)
        {
                A a = new B();
                a.show();

                B b = new C();
                b.show();
        }
}


作者: 来男.    时间: 2014-5-4 01:10
蛤蟆太康 发表于 2014-5-3 23:20
不好意思,第一次发帖,代码是复制上去的,竟然没显示出来,下面是代码,请看一下。class A
{
        public vo ...

首先得明确一些子类转型为父类的规则:

class A
{
        public void show()
        {
                show2();
        }

        public void show2()
        {
                System.out.println("我");
        }
}
class B extends A
{
        public void show2()
        {
                System.out.println("爱");
        }
}
class C extends B
{
        public void show()
        {
                super.show();
        }

        public void show2()
        {
                System.out.println("你");
        }
}

public class Test
{
        public static void main(String[] args)
        {
                A a = new B();
                a.show();

                B b = new C();
                b.show();
        }
}


1、A a =new B();是父类引用指向子类对象;
2、a.show()是在B类中寻找show方法,但没有,在父亲A那儿找到并调用show中show2方法,
因为show2被子类B复写所以调子类B的show2方法输出"爱";
3、B b=new C();是父类B指向子类C,在C类找到show()后调super.show(),在他爹B类未找到,找爷爷A,找到show后
调show2(),因为show2()被C类复写所以调子类C的show2()方法输出“你”。






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