一、多态

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

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

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

而产生了不同的行为。

形成多态的三个条件:

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. 孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式

    孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 在我学习过的所有语言中,对VB系的语言比较喜欢,而对C系和J系 ...

  2. ipa和ironic-conductor交互

    IPA使用lookup和hearteat机制与Ironic Conductor进行交互,启动时agent给Conductor的vendor_passthru lookup endpoint(地址为/v ...

  3. 【志银】NYOJ《题目529》flip

    题目:flip 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=529 吐槽Time: 由于此题槽点太多,所以没忍住... 看到这题通过率出 ...

  4. JavaWeb笔记(四)Cookie&Session

    Cookie 客户端会话技术,客户端保存,用于存储少量不太敏感的数据,在不登陆的情况下完成服务器对客户端的身份识别 简单使用步骤 创建Cookie对象,绑定数据 new Cookie(String n ...

  5. table & colgroup

    table & colgroup // <caption>版本信息</caption> table = ` <table class="versions ...

  6. ROS内usb_cam包使用注意事项

    1.查看摄像头支持的pixel-format: 方法:  v4l2-ctl --list-formats-ext -d /dev/video0

  7. vue项目--favicon设置以及动态修改favicon

    最近写公司项目时,动态更新favicon 动态更新之前需要有一个默认的favicon. 目前vue-cli搭建的vue项目里面已经有了一个static文件夹,存放静态文件. favicon图片放到该文 ...

  8. webpack最佳入门实践系列(3)

    6.使用图片 6.1.尝试在css中引入图片 在src目录下新建css文件夹,并且在css文件夹下创建app.css文件,在src目录下新建images文件夹,放入一张图片,在app.css中引入这张 ...

  9. LinuxMint下JDK+Tomcat+Mysql+Eclipse javaEE安装

    网上查了很多方法,总结下比较简单的做法. 本人使用的系统版本为64位LinuxMint18,cinnamon桌面环境,预装Openjdk1.8.开发使用版本为oracle的1.7版本jdk. 1 jd ...

  10. 使用aiohttp的一个小例子

    #!/usr/bin/env python # encoding: utf-8 import aiohttp import asyncio import traceback import time i ...