一、多态

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

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

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

而产生了不同的行为。

形成多态的三个条件:

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. c# asp.net 中使用token验证

    基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息.这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提 ...

  2. css:hover状态改变另一个元素样式的使用

    效果演示 css:hover状态改变另一个元素样式的使用 .box { width: 150px; height: 150px; background-color: #069; line-height ...

  3. hp raid json

    hp机器均已在装OS之前划好raid,统一规格为2*480G SSD, 12*4T SATA ,2*1.6T SSD,其中2*480G SSD做系统盘,划分raid1 已知disk controlle ...

  4. hadoop-eclipse环境搭建(二)

    Eclipse插件配置 第一步:把我们的"hadoop-eclipse-plugin-1.0.0.jar"放到Eclipse的目录的"plugins"中,然后重 ...

  5. struts框架搭建

    struts是开源框架.使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间.如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,struts是一个不错的 ...

  6. 图表绘制工具--Matplotlib 1

    ''' [课程3.] Matplotlib简介及图表窗口 Matplotlib → 一个python版的matlab绘图接口,以2D为主,支持python.numpy.pandas基本数据结构,运营高 ...

  7. POJ 2676 数独+dfs深搜

    数独 #include "cstdio" #include "cstring" #include "cstdlib" #include &q ...

  8. HDU 4649 Professor Tian (概率DP)

    Professor Tian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  9. parallel programming. this causual litery nots represents my recent progress in parallel programming in c#.It`s interesting.

    not to say extra words,let`s start the code. pasted below: using System; using System.Collections.Ge ...

  10. 行为型设计模式之解释器模式(Interpreter)

    结构 意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 适用性 当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用 ...