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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蛤蟆太康 中级黑马   /  2014-5-3 21:35  /  1134 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. 断点调试过了,还是没搞清楚为什么结果会是“爱你”,方法调用的步骤能猜到,但是就是不知道原理为什么,求大神指教!!!
复制代码

3 个回复

倒序浏览
本帖最后由 张然龙 于 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. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
张然龙 发表于 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-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()方法输出“你”。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马