-----------------《疯狂Java讲义精粹》2读书笔记---------------

  Java引用变量有两个类型:

    · 编译时类型(由声明该变量时使用的类型决定)
    · 运行时类型(由实际赋给该变量的对象决定)

  当编译时类型和运行时类型不一致,就可能出现多态(Polymorphism)。往往是相同类型的变量、调用同一个方法时呈现出多种不同的行为特征。

看下面这个例子:

 1 public class TestExtends extends BaseClass{
 2     public String book = "子类的book成员";
 3     public void test(){
 4         System.out.println("子类覆盖父类的test方法");
 5     }
 6     public void sub(){
 7         System.out.println("子类自己的方法");
 8     }
 9
10     public static void main(String[] args) {
11         /**
12          * 子类其实是一种特殊的父类,因此Java允许把一个子类对象直接赋给一个父类引用,
13          * 无需仍和转换,或者称为向上转型(upcasting),由系统自动完成。
14          */
15         BaseClass bc = new TestExtends();//父类引用指向子类对象
16         System.out.println(bc.book);//调用父类的book
17         bc.base();//调用基类的普通方法
18         bc.test();//调用子类覆盖的方法
19         //bc.sub();//将会出错
20     }
21 }

结果为:

    6基类的普通方法....子类覆盖父类的test方法

  通过引用变量来访问其包含的实例成员时,系统总是访问它编译时所定义的成员,而不是运行时所定义的成员,即使它实际所引用的对象确实包含该方法。

例如上面的引用变量bc想调用运行时的成员方法sub(即bc.sub())时就会出错。

  那么怎么才能让这个引用变量调用它运行时的成员方法呢?
  其实很简单,只需要强制转换类型就可以了。也就是说:强制转换类型可以将一个引用类型的变量转换成其子类类型。当然,在执行强制转换类型时应当注意:
    · 基本类型的转换只能在数值类型(整形、字符型和浮点型)之间转换。数值类型和布尔类型之间不能进行类型转换。
    · 引用类型之间的转换只能在具有继承关系的两个类型之间转换。如果试图把一个父类型转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类型,而运行时类型为子类类型才行),否则会出现ClassCastException异常。

  例如:将上面的代码第19行进行强制类型转换从而调用子类的成员方法:

19 ((TestExtends) bc).sub();//转换后调用运行时的成员方法

运行的结果为:

   6基类的普通方法....子类覆盖父类的test方法子类自己的方法

  

转载于:https://www.cnblogs.com/CocoonFan/archive/2013/03/05/2943663.html

《疯狂Java讲义精粹》读书笔记2 ------ 多态相关推荐

  1. 《疯狂Java讲义》读书笔记5

    目录 Java的集合类 Inerator 接口 Set 集合 HashSet 类 LinkedHashSet 类 TreeSet 类 EnumSet 类 List 集合 ArrayList 和 Vec ...

  2. 《疯狂Java讲义》读书笔记4

    一个 acm 的题解: http://t.csdn.cn/o2wI7 初始化块 是构造器的补充,在构造器之前执行. 是一段固定的代码,不接受任何参数. 构造器其实是一个假象,编译Java类后,初始化块 ...

  3. 《疯狂Java讲义》读书笔记2

    数据结构,对单链表的总结: http://t.csdn.cn/xtSLW 这两天看了很久的链表,感觉之前学习的很浅,没有完全理解链表的构成,这两天数据结构的作业都是关于链表的,就花时间整理了一下. 在 ...

  4. 《疯狂Java讲义》读书笔记3

    这两天总结了数据结构中栈的用法,对栈的初始化.出栈.入栈的总结: http://t.csdn.cn/7sKjQ 对双栈共享的初始化.入栈.出栈的总结: http://t.csdn.cn/4WXCO 调 ...

  5. 《疯狂Java讲义》读书笔记1

    这个题挺难写的,直接用 bfs 肯定做不出来,还涉及了很多其他没有学过的知识点,所以写了一篇题解. 简单搜索&&进阶搜索 - Virtual Judge (vjudge.net) ht ...

  6. 《疯狂Java讲义》读书笔记(七):Swing编程

    第十二章 Swing编程 1.Swing开发图形界面比AWT更加优秀,它是一种轻量级组件,采用100%的Java实现,不依赖于本地平台的图形界面,对跨平台支持比较出色.依赖于本地平台的AWT组件被称为 ...

  7. 疯狂Java讲义(读书笔记)(第五章)

    第五章面向对象(下) 5.1 Java 8 增强的包装类 把字符串类型的值转换为基本类型的值有两种方式. 利用包装类提供的parseXxx(String s)静态(除了Character之外的所有包装 ...

  8. 《疯狂Java讲义》读书笔记7

    Navicat快捷键 刷新:Fn+F5 表内容页面打开表设计页面:Ctrl+D 打开 MYSQL 命令行窗口:Fn+F6 MYSQL 增减查改 create table student(stuid i ...

  9. 《疯狂Java讲义》读书笔记(四):Java基础类库

    第七章 Java基础类库 ①使用Scanner获取键盘输入:Scanner类提供了多个构造器,不同构造器可以接收文件.输入流.字符串作为数据源,主要提供了2个方法:hasNextXXX()是否还有下一 ...

最新文章

  1. Linux C编程--进程间通信(IPC)3--信号集和发送信号介绍
  2. hbase shell 查看列名_hbase shell 命令行的操作
  3. ubuntu11.10+git+svn works
  4. springboot---整合redis
  5. linux创建vnc服务器,五步建立一个VNC Linux服务器
  6. mysql学习笔记(1-安装简介)
  7. 在DataGrid和GridView中对表头设定背景图片
  8. Java连接程序数据源
  9. HCIE-RS面试--RSTP为什么优于STP
  10. VMware 15.5.0安装教程
  11. nginx配置ssl证书
  12. java求两数最小公倍数_java求解2个数的最小公倍数
  13. 基于FBX SDK的FBX模型解析与加载 -(一)
  14. iOS--TexiField相关
  15. Android图形shape的gradient渐变色背景
  16. 【原创整理】软件测试自我记录(目前携程+招银网络科技)
  17. 家用小型中央空调发展的现状与趋势
  18. 微信小程序太阳落日效果
  19. Learning Human-Object Interactions by Graph Parsing Neural Networks阅读笔记
  20. android串口获取电子秤数据,c# 打开电子秤串口并读取电子秤数据

热门文章

  1. hive执行drop卡死一例:java.lang.NoSuchMethodError: org.apache.commons.lang3.StringUtils.isAnyBlank
  2. No execution.target specified in your configuration file.
  3. ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint
  4. tensorflow中的log中数字的含义
  5. clion的project区的字体以及自动排版的快捷键修改
  6. 大话数据结构:拓扑排序
  7. 深度学习(四十二)——深度强化学习(5)PPO, IMPALA, Hierarchical RL, OpenAI
  8. 机器学习算法与Python实践之(二)k近邻(KNN)
  9. xtrabackup mysql 5.6_percona-xtrabackup工具实现mysql5.6.34的主从同步复制
  10. MySQL中的UNIX_TIMESTAMP函数使用总结