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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© a80C51 中级黑马   /  2015-9-10 21:33  /  221 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1,定义
        相同类型的变量,调用同一个方法时,呈现出多种不同的行为特征。
2,父类多态的体现
        a,父类的引用指向了自己的子类对象
        b,父类的引用也可以接收自己子类的对象
3,多态的前提
        a,类与类之间有关系,要么继承,要么实现;
        b,类与类之间存在覆盖。
4,多态的好处
        大大提高程序的扩展性。
5,多态的弊端
        只能使用父类的引用访问父类中的成员。
6,类型转换
        class Cats extends Animal
        {}
        Animal a = new Cats();//类型提升,向上提升。
        Cats c = (Cats)a;//强制将父类的引用,转成子类。
        强制类型转换的注意事项
        1,基本类型之前的转换只能在数值类型(整型、字符型和浮点型)之间进行。
        2,引用类型之间的转换只能在具有继承关系的两个类型之间进行。
7,instanceof关键字
        作用:避免出现ClassCastException异常。
        用法:前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类。
        读法:判断前面的对象是否是后面的类,或者其子类、实现类的实例。如果是,则返回true,否则返回false。
        注意事项:
        运算符前面操作数的编译时类型要么与后面的类型相同,要么与后面的类具有父子类继承关系。
8,多态始终都是子类在做着变化。
9,多态中成员的特点
        只有非静态的成员方法,才会有如下原则:
        编译时看左边,运行时看右边。
        换言之,编译时期。要看引用型变量所属的类中是否有调用方法;
        而运行时,要参考对象所属的类中是否有调用的方法。
        而对于其他成员,则只看左边即可。
10,接口类型的引用变量指向它自己子类的对象。
       
相应例子如下:
接口相关:
  1. interface PCI
  2. {
  3.         public abstract void open();
  4.         public abstract void close();
  5. }

  6. class NetCard implements PCI
  7. {
  8.         public void open()
  9.         {
  10.                 System.out.println("NetCard is open!!!!");
  11.         }
  12.         public void close()
  13.         {
  14.                 System.out.println("NetCard is close!!!!");
  15.         }
  16. }

  17. class SoundCard implements PCI
  18. {
  19.         public void open()
  20.         {
  21.                 System.out.println("SoundCard is open!!!!!!!!");
  22.         }
  23.        
  24.         public void close()
  25.         {
  26.                 System.out.println("SoundCard is close!!!!!");
  27.         }
  28. }

  29. class MainBoard
  30. {
  31.         public void run()
  32.         {
  33.                 System.out.println("the MainBoard is running!!!");
  34.         }
  35.        
  36.         public void usePCI(PCI p)
  37.         {
  38.                 if(p == null)
  39.                         System.out.println("nothing is here!!!");
  40.                
  41.                 p.open();
  42.                 p.close();
  43.         }
  44. }

  45. public class myMainBoard
  46. {
  47.         public static void main(String[] args)
  48.         {
  49.                 MainBoard mb = new MainBoard();
  50.                
  51.                 mb.run();
  52.                
  53.                 mb.usePCI(new NetCard());//接口类型的引用变量指向它自己子类的对象.
  54.                 mb.usePCI(new SoundCard());//接口类型的引用变量指向它自己子类的对象.
  55.         }
  56. }
复制代码


其他与多态相关
  1. class BaseClass
  2. {
  3.         //父类的实例成员变量
  4.         public int booksNums = 6;
  5.        
  6.         public void base()
  7.         {
  8.                 System.out.println("父类的普通方法");
  9.         }
  10.        
  11.         public void test()
  12.         {
  13.                 System.out.println("父类被覆盖的方法");
  14.         }
  15.        
  16.         public static void testStaticMethod()
  17.         {
  18.                 System.out.println("父类的静态方法");
  19.         }
  20. }

  21. class SubClass extends BaseClass
  22. {
  23.         //子类的实例成员变量
  24.         public int booksNums = 8;
  25.        
  26.         public void test()
  27.         {
  28.                 System.out.println("子类覆盖父类的方法");
  29.         }
  30.        
  31.         public void sub()
  32.         {
  33.                 System.out.println("子类的普通方法");
  34.         }
  35.        
  36.         public static void testStaticMethod()
  37.         {
  38.                 System.out.println("子类覆盖父类的静态方法");
  39.         }
  40. }

  41. public class PolymorphismClass
  42. {
  43.         public static void main(String[] args)
  44.         {
  45.                 //父类的引用指向自己子类的对象
  46.                 BaseClass bs = new SubClass();//类型提升
  47.                
  48.                 //对于多态中的成员变量,无论编译和运行,都参考左边。
  49.                 System.out.println(bs.booksNums);
  50.                
  51.                 //对于多态中的非静态方法,编译时,参考左边;运行时,参考右边
  52.                 bs.test();
  53.                 //因此,如下语句报错
  54.                 //bs.sub();
  55.                
  56.                 //对于多态中的静态方法,编译和运行时,都参考右边
  57.                 bs.testStaticMethod();
  58.                
  59.                 SubClass sb = (SubClass)bs;//强制将父类的引用,转成子类。
  60.                 sb.sub();
  61.                
  62.                 //instanceof使用注意事项:
  63.                 //运算符前面操作数的编译时类型要么与后面的类型相同,要么与后面的类具有父子类继承关系。
  64.                 if(sb instanceof BaseClass)
  65.                         System.out.println("sb is a instance of BaseClass");
  66.                 //如下会引起编译错误
  67.                 //if(sb instanceof String)
  68.                         //System.out.println("sb is a instance of Object");
  69.         }
  70. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马