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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小狼 中级黑马   /  2013-8-23 22:21  /  2078 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小狼 于 2013-8-23 22:23 编辑

1.JAVA引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋值给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。

2.相同类型的变量,调用同一个方法时呈现出多种不同的行为特征,这就是多态。
  与方法不同的是,对象的Field则不具备多态性。

3.引用变量在编译时只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法,因此,编写JAVA代码时,引用变量只能调用声明该变量时所用类里的方法,例如:Object p = new Person();
4.代码定义了一个变量p,则这个p只能调用Object类的方法,而不能调用person类里定义的方法。
通过引用变量来访问其包含的实例Field时,系统会试图访问它编译时类型所定义的Field,而不是它运行时类型所定义的Field
举例:
  1. class BaseClass
  2. {
  3.      public int book = 6;
  4.      public void base()
  5. {
  6. System.out.println("父类的普通方法");
  7. }
  8.      public void test()
  9. {
  10.      System.out.println("父类的被覆盖的方法");
  11. }
  12. }
  13.      public class SubClass extends BaseClass
  14. {
  15.      //重新定义一个book实例Field隐藏父类的book实例Field
  16.      public String book = "轻量级Java EE企业应用实战";
  17. public void test()
  18. {
  19.      System.out.println("子类的覆盖父类的方法");
  20. }
  21. public void sub()
  22. {
  23.      System.out.println("子类的普通方法");
  24. }
  25. public static void main(String[] args)
  26. {
  27.      //下面编译时类型和运行时类型完全一样,因此不存在多态
  28.      BaseClass bc = new BaseClass();
  29.      //输出 6
  30.      System.out.println(bc.book);
  31.      //下面两次调用将执行BaseClass的方法
  32.      bc.base();
  33.      bc.test();
  34.      //下面编译时类型和运行时类型完全一样,因此不存在多态
  35.      SubClass sc = new SubClass();
  36.      //输出"轻量级J2EE企业应用实战"
  37.      System.out.println(sc.book);
  38.      //下面调用将执行从父类继承到的base方法
  39.      sc.base();
  40.      //下面调用将执行从当前类的test方法
  41.      sc.test();
  42.      //下面编译时类型和运行时类型不一样,多态发生
  43.      BaseClass ploymophicBc = new SubClass();
  44.      //输出 6 —— 表明访问的是父类Field
  45.     System.out.println(ploymophicBc.book);
  46.      //下面调用将执行从父类继承到的base方法
  47.     ploymophicBc.base();
  48.     //下面调用将执行从当前类的test方法
  49.     ploymophicBc.test();
  50.     //因为ploymophicBc的编译类型是BaseClass,
  51.      //BaseClass类没有提供sub方法,所以下面代码编译时会出现错误。
  52.      //ploymophicBc.sub();
  53.   }
  54. }
复制代码

评分

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

查看全部评分

1 个回复

倒序浏览
鼓励总结,有助知识巩固
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马