一、多态

多态是指同一个方法被调用,由于对象不同导致行为不同。

例如调用自由活动方法,张三喜欢玩耍,那么他就会去玩耍。

李四喜欢学习,那么他可能去学习。调用方法因对象的不同

而产生了不同的行为。

形成多态的三个条件:

1.继承

2.子类重写父类方法。

3.父类类型,子类对象。

以下列代码为例:

 public class Test {
public static void main(String[] args) {
Student stu = new Student();
Teach tea = new Teach();
freeActivi(stu);
freeActivi(tea);
} static void freeActivi(Person per){//实现多态的条件之父类类型,子类对象
per.freeActivi(); //这样对象不同可以展现出不同的行为
} //虽然参数类型是父类Person,但子类对象(stu,tea)会自动向上转型
//成Person,但调用的还是被子类重写的方法。
} class Person{
void freeActivi(){
System.out.println("自由时间");
}
} class Student extends Person{ //实现多态的条件之继承
void freeActivi(){ //实现多态的条件之重写
System.out.println("玩耍");
}
} class Teach extends Person{
void freeActivi(){
System.out.println("备课");
}
}
运行结果:
玩耍
备课

可能大家会说多态有什么好处?

如果没有多态,那么每一个子类都需要重写定义以方法,例如:

static void freeActivi(Student per){
per.freeActivi();
} static void freeActivi(Teach per){
per.freeActivi();
}//假如有几十种类型,一个一个创建对应的方法就很麻烦。

如果没有多态,那么不同类型需要一个个创建方法,方法一多就非常麻烦,有了多态可以省去很多步骤。

二、转型

可能大家不是很能理解static void freeActivi(Person per)这里的Person类型。结合下面的向上转型大家可能更好理解。

对象向上转型  父类  父类对象 = 子类对象    将子类对象转为父类对象,例如 Person per = stu;

用下面代码便于大家理解

 public class Test {
public static void main(String[] args) {
Student stu = new Student(); //首先创建了一个子类对象
Person per = stu; //然后将子类对象向上转型
per.freeActivi(); //然后调用父类对象中的方法。
}
//运行后我们发现,结果是玩耍,并不是自由时间。
//如果对象发生向上转型,调用的一定是被子类重写的方法。
} class Person{
void freeActivi(){
System.out.println("自由时间");
}
} class Student extends Person{
void freeActivi(){
System.out.println("玩耍");
}
}
运行结果:
玩耍

如果将一个子类对象向上转型后,则调用的父类方法是被子类重写之后的方法,因此可以实现多态。

但是向上转型后的对象,无法在调用子类中方法,例如将Student 类的stu对象向上转型成Person。

此时只能调用Person中的方法,无法调用Student中的方法,此时需要向下转型才能调用Student中的方法。

子类 子类对象 = (子类)父类对象; 向下转型, 父类对象转为子类对象。

如下代码:

 public class Test {
public static void main(String[] args) {
Person stu = new Student(); //这里发生了向上转型,父类 父类对象 = 子类对象。
Student stu_s = (Student)stu; //这里又发生了向下转型
stu_s.test(); //转型完后才可以调用子类中的test方法,没有转型是无法调用的。 }
} class Person{
void freeActivi(){
System.out.println("自由时间");
} } class Student extends Person{
void freeActivi(){
System.out.println("玩耍");
}
void test(){
System.out.println("test");
}
}
运行结果:
test

1.12(java学习笔记)多态及向上、向下转型的更多相关文章

  1. java学习笔记 --- 多态

    一.多态 (1)定义:同一个对象在不同时刻体现出来的不同状态.父类的引用或者接口的引用指向了自己的子类对象.   Dog d = new Dog();//Dog对象的类型是Dog类型.  Animal ...

  2. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  3. java学习笔记之OOP(二)

    java学习笔记二.面向对象[OOP]Object Oriented Programming 一.三大特性: 1.封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用 ...

  4. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  5. Java学习笔记之---面向对象

    Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...

  6. 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词

    第01章 计算机.程序和Java概述 CPU(Central Processing Unit) * 中央处理器 Control Unit * 控制单元 arithmetic/logic unit /ə ...

  7. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  8. 20145330第八周《Java学习笔记》

    20145330第八周<Java学习笔记> 第十五章 通用API 通用API 日志:日志对信息安全意义重大,审计.取证.入侵检验等都会用到日志信息 日志API Logger:注意无法使用构 ...

  9. 20145330第七周《Java学习笔记》

    20145330第七周<Java学习笔记> 第十三章 时间与日期 认识时间与日期 时间的度量 GMT(格林威治标准时间):现在不是标准时间 世界时(UT):1972年UTC出来之前,UT等 ...

  10. 20145330第六周《Java学习笔记》

    20145330第六周<Java学习笔记> . 这周算是很忙碌的一周.因为第六周陆续很多实验都开始进行,开始要准备和预习的科目日渐增多,对Java分配的时间不知不觉就减少了,然而第十和十一 ...

随机推荐

  1. Linq中Count()和Any()引发的效率问题

    1.count和any 今天看了鹤冲天的文章:Linq:切勿使用 Count() > 0 来判断集合非空   有所收获,写下文章总结一下: 先看如下代码: static void Main(st ...

  2. Python网络编程(OSI模型、网络协议、TCP)

    前言: 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系. 在数学上,网络是一种图,一般认为专指加权图. 网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象 ...

  3. sql 游标使用

    declare @PASSDate datetime,@VLPN varchar(50),@VLPNColor varchar(10),@nambers int set @VLPN='';set @V ...

  4. vim使用的一些积累

    vi visual interfacevim vi improved vim模式:编辑模式(命令模式)输入模式末行模式 编辑模式下,zz保存并退出移动光标:(编辑模式)1.逐字符移动 h 左 l 右 ...

  5. Hexo-设置阅读全文

    最近使用Hexo搭建了自己的博客,并且使用了简洁但是强大的NexT主题.这里介绍一下NexT主题下设置在首页显示一篇文章的简介,在简介后面提供一个链接阅读全文来进入文章的详情页.效果请看 我的小窝 在 ...

  6. h5 Visibility API总结

    最近活动中的小游戏,有涉及页面隐藏或app后台运行时候,暂停游戏的功能,使用了h5的Visibility API,在此总结如下: 两个属性 document.hidden (Read only) 如果 ...

  7. bzoj2957:楼房重建

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 sol  :首先考虑转化问题,即给你一个斜率序列,让你动态维护单调栈 考虑线段树,令ge ...

  8. 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...

  9. mac 安装 nodeJs&npm 配置

    前言:继续安装 nodeJS 下载安装:直接去官网,点击安装即可. 命令式安装: 1. 安装 homebrew 2. 安装 nodeJS,使用命令:brew install node 3. 测试 no ...

  10. 编写Shell脚本的最佳实践,规范一

    随着写的SHELL程序越来越多,发现自己每次写都有不同的习惯或者定义了不同的东西,变量名定义得不一样,整个程序缩进不统一,没有注释等问题,等我回过头看这些程序的时候发现很麻烦.所以写了个shell代码 ...