一、多态

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

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

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

而产生了不同的行为。

形成多态的三个条件:

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. 重现ssd遇到的问题

    首先是create_list.sh和create_data.sh中的data_dir的路径得修改. 然后是在create_data.sh文件调用$caffe_root下的scripts目录中的crea ...

  2. php session访问限制

    登录 <?php // 启动会话 session_start(); // 注册登陆成功的 admin 变量,并赋值 true $_SESSION["admin"] = tru ...

  3. hdu 1203 01背包 I need a offer

    hdu 1203  01背包  I need a offer 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 题目大意:给你每个学校得到offe ...

  4. 【bzoj2506】calc 根号分治+STL-vector+二分+莫队算法

    题目描述 给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值i的个数. 输入 第一行两个正整数n ...

  5. P2052 [NOI2011]道路修建

    题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路. 每条道 ...

  6. MPLAB® XC C编译器的Workstation License的获取及安装方法

    MPLAB®XC C编译器的Workstation License获取及安装方法如下:首先需要购买获得一个XC C编译器的激活码,然后到以下网页(http://www.microchip.com/rl ...

  7. Linux系统——提高编译速度的方法

    编译优化: 基本原则就是“以空间换时间” tmpfs: 解决IO瓶颈,充分利用本机内存资源 make -j: 充分利用本机计算资源 distcc: 利用多台计算机资源 ccache: 减少重复编译相同 ...

  8. Codeforces Round #324 (Div. 2) D

    D. Dima and Lisa time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  9. 看angualrjs源码中怎么判断所属的类型

    下面是angualrjs的代码: function isFile(obj) { return toString.call(obj) === '[object File]'; } function is ...

  10. firefox解决flash崩溃

    1.地址栏输入 about:config 2.查找dom.ipc.plugins.flash.subprocess.crashreporter.enabled 更改为false