Java学习之 多态 Polymorphism
转自:http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html
多态的概念
多态==晚绑定。
不要把函数重载理解为多态。
因为多态是一种运行期的行为,不是编译期的行为。
多态:父类型的引用可以指向子类型的对象。
比如 Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
如果有,再去调用子类的该同名方法。
(注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)
(参考学习链接:http://docs.oracle.com/javase/tutorial/java/IandI/override.html)
如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将p转换为子类Child类型的引用。
因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。
结合实例说明
下面举个例子(有问题的代码已注释):
主要讲讲两种类型转换和两种编译时候的错误。
1 多态示例代码
2
3 public class PolyTest
4 {
5 public static void main(String[] args)
6 {
7
8 //向上类型转换
9 Cat cat = new Cat();
10 Animal animal = cat;
11 animal.sing();
12
13
14 //向下类型转换
15 Animal a = new Cat();
16 Cat c = (Cat)a;
17 c.sing();
18 c.eat();
19
20
21 //编译错误
22 //用父类引用调用父类不存在的方法
23 //Animal a1 = new Cat();
24 //a1.eat();
25
26 //编译错误
27 //向下类型转换时只能转向指向的对象类型
28 //Animal a2 = new Cat();
29 //Cat c2 = (Dog)a2;
30
31
32
33 }
34 }
35 class Animal
36 {
37 public void sing()
38 {
39 System.out.println("Animal is singing!");
40 }
41 }
42 class Dog extends Animal
43 {
44 public void sing()
45 {
46 System.out.println("Dog is singing!");
47 }
48 }
49 class Cat extends Animal
50 {
51 public void sing()
52 {
53 System.out.println("Cat is singing!");
54 }
55 public void eat()
56 {
57 System.out.println("Cat is eating!");
58 }
59 }
多态示例代码
例子的执行结果:

这段代码:

Cat类中定义了eat()方法,但是Animal类中没有这个方法,a1引用是Animal类的,所以找不到,编译时出错:

两种类型的类型转换
(1)向上类型转换(Upcast):将子类型转换为父类型。
对于向上的类型转换,不需要显示指定,即不需要加上前面的小括号和父类类型名。

(2)向下类型转换(Downcast):将父类型转换为子类型。
对于向下的类型转换,必须要显式指定,即必须要使用强制类型转换。

并且父类型的引用必须指向子类的对象,即指向谁才能转换成谁。
不然也会编译出错:


因为父类引用指向的是Cat类的对象,而要强制转换成Dog类,这是不可能的。
多态学习的第二部分,抽象类和接口:http://www.cnblogs.com/mengdd/archive/2012/12/25/2832656.html
Java学习之 多态 Polymorphism的更多相关文章
- java面向对象之 多态 Polymorphism
多态(Polymorphism):用我们通俗易懂的话来说就是子类就是父类(猫是动物,学生也是人),因此多态的意思就是:父类型的引用可以指向子类的对象. 1.多态的含义:一种类型,呈现出多种状态 主要讨 ...
- Java学习笔记——多态性Polymorphism
Java中实现多态的机制 Java中实现多态的机制靠的是父类或者接口定义的引用变量可以指向子类或者具体的实现类的实例对象,而程序调的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就 ...
- Java学习之多态(Polymorphism)
多态==晚绑定 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); 当使用多态方 ...
- Java学习之多态
多态的概念 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); ...
- java学习(二)多态中成员变量详解
今天我总结了一下java多态中成员变量的赋值与调用 举一个我当初做过的小案例: class Fu{ int num; void show(){} } class Zi extends Fu{ //in ...
- [Java学习]面向对象-多态
多态 多态发生条件 发生在有继承关系的类型中. 向上转型(自动类型转换)与向下转型(强制类型转换) //向上转型 //编译阶段a1被编译器看作是Animal类型,所以a1引用绑定的是Animal类中的 ...
- JAVA学习:多态
多态:可以理解为事物存在的多种体现形态. 人:男人,女人 动物:猫,狗. 猫 x = new 猫(); 动物 x = new 猫() 1,多态的体现 父类的引用指向了自己的子类对象. 父类的引 ...
- java学习笔记 --- 多态
一.多态 (1)定义:同一个对象在不同时刻体现出来的不同状态.父类的引用或者接口的引用指向了自己的子类对象. Dog d = new Dog();//Dog对象的类型是Dog类型. Animal ...
- Java学习之多态---类成员变化
类成员 一.成员变量 编译时:变量(f)所属类(Fu)中是否有成员变量,有:编译成功,没有:编译失败 运行时:变量(f)所属类(Fu)中是否有成员变量,运行该类(Fu)中的成员变量 class Fu ...
随机推荐
- Winform框架中窗体基类的用户身份信息的缓存和提取
在Winform开发中,有时候为了方便,需要把窗体的一些常规性的数据和操作函数进行封装,通过自定义基类窗体的方式,可以实现这些封装管理,让我们的框架统一化.简单化的处理一些常规性的操作,如这里介绍的用 ...
- 【系统学习ES6】新专题发布
我要发免费专题了,向下看 公众号和博客都有一阵没更新了,丢了一些粉儿,但是也很庆幸,时时还会有人关注.我并不是什么专业讲师,文章都是利用业余时间手工原创.在这里非常感谢各位的支持和厚爱. 这个月开始, ...
- 第十五篇 -- QListWidget与QToolButton(界面)
效果图: 这还只是一个界面,并没有实现相应功能. 先看下这图的构成吧. 工具栏的就是将Action拖上去,这部分前面已经介绍过了,那就看下面这部分的构图. 1.左侧是一个工具箱(ToolBox)组件, ...
- 构建后端第2篇之---springb @ComponentScan注解使用
张艳涛写于2021-2-8日 构建后端项目的时候遇到一个问题,在zyt-auth项目的依赖定义了@Component类,这个类在项目启动的时候提示没有找到bean Field tokenService ...
- a = input(a, yymmdd10.)引发的问题
在数据清理过程中,经常会遇到以文本储存的日期型数据,这种数据不能直接进行分析,需要先将其转化为以数值存储的格式. 首先准备数据集: data data1; input a :$10. b :$10. ...
- etcd raft 处理流程图系列1-raftexample
最近在看raft相关的代码和实现,发现etcd的raft模块在实现上还是比较灵活的,但缺点就是需要用户实现比较多的功能,如存储和网络等,同时带来的优点就是不会对用户的存储和传输作限制.网上对该模块的描 ...
- 从 HTTP 切换到 HTTPS,这下我的技术博客安全了吧?
博客园 的小伙伴们,大家好,我是刚脱离险境的二哥呀! 很久(大概两年)之前,我就搞了一个独立的个人博客网站,长下面这样. 大家有访问过的,可以在评论区扣 1 可惜一直没搞备案和 HTTPS,导致每次访 ...
- SQL语句(三)分组函数和分组查询
目录 一.分组函数 特点 1. 各函数的简单使用 2. 搭配distinct的使用 3. COUNT 统计行数 4. 和分组函数一同查询的字段要求是group by后的字段 二.分组查询 1. 简单应 ...
- Mybatis学习笔记-注解开发
面向接口编程 根本原因:[解耦],[可拓展],[更高规范性] 接口类型: abstract class interface 使用注解开发 简单语句可用注解开发(直接查询,列名与属性名相同) 本质:反射 ...
- netty系列之:中国加油
目录 简介 场景规划 启动Server 启动客户端 消息处理 消息处理中的陷阱 总结 简介 之前的系列文章中我们学到了netty的基本结构和工作原理,各位小伙伴一定按捺不住心中的喜悦,想要开始手写代码 ...