Java 面向对象三大特征之一: 多态
多态与类型转换
子类重写父类方法
1)位置:子类和父类中有同名的方法
2)方法名相同,返回类型和修饰符相同,参数列表相同
方法体不同
多态的优势和应用场合
多态:同一个引用类型,使用不同的实例而执行不同的操作
实现多态的两种形式
1.使用父类作为方法形参实现多态
2.使用父类作为方法返回值实现多态
形式1.1:父类做形参
子类做实参
形式1.2:父类做类型
子类实例化
(数据类型中的自动类型转换)
形式2.1:父类作为方法的返回值
子类实例化,类型自动转换
生活中的多态:
打印机
结论:
同一事物,由于条件不同,产生的结果也不同
多态实现思路:
编写父类
编写子类,子类重写父类方法
运行时,使用父类的类型,子类的对象(自动类型转换)
优势:
■多态可以减少类中代码量
·可以提高代码的可扩展性和可维护性
■向上转型一子类转换为父类,
·自动进行类型转换
■向下转型一父类转换为子类,
·结合instanceof运算符进行强制类型转换
栗子:
/**
*
*/
package bdqn.javademos;
/**
*
* @author: 房上的猫
*
* @time: 下午3:51:59
*
* 博客地址: https://www.cnblogs.com/lsy131479/
*
*/
/**
* @author xjz
*父类 宠物类
*/
public class Pet {
public void eat(){
System.out.println("pet正在吃");
}
}
父类
/**
*
*/
package bdqn.javademos;
/**
*
* @author: 房上的猫
*
* @time: 下午3:51:59
*
* 博客地址: https://www.cnblogs.com/lsy131479/
*
*/
/**
* @author xjz
*
*/
public class Cat extends Pet {
public void eat(){
System.out.println("猫吃猫粮");
}
public void ball(){
System.out.println("猫玩球");
}
}
Cat类
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*子类:狗狗类
*/
public class Dog extends Pet{
public void eat(){
System.out.println("狗狗吃狗粮");
}
public void catchFlyDisk(){
System.out.println("狗狗玩飞盘");
}
}
Dog类
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*企鹅类
*/
public class Penguin extends Pet{
public void eat(){
System.out.println("企鹅吃鱼");
}
public void swiming(){
System.out.println("企鹅游泳");
}
}
Penguin 类
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*主人类
*/
public class Master {
public void feed(Pet pet){
pet.eat();
}
//领养宠物 多态形式3:父类作为方法返回值,子类实例化 类型自动转换
public Pet getPet(int typeid){
Pet pet=null;
if(typeid==1){
pet=new Dog();
}
else if(typeid==2){
pet=new Penguin();
}
else if(typeid==3)
{
pet=new Cat();
}
return pet;
}
}
Master 类
package bdqn.javademos;
import java.util.Scanner;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//多态的形式1
Dog dog=new Dog();
Penguin peng=new Penguin();
Cat cat=new Cat();
Master ms=new Master();
ms.feed(dog);
ms.feed(peng);
ms.feed(cat);
//多态的形式2:父类做类型,子类实例化
Pet pet=new Dog();//自动转换
pet.eat();
//调用领养宠物 形式3:父类作为方法的返回类型
System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅 3-猫) ");
Scanner input=new Scanner(System.in);
int xz=input.nextInt();
Master dx=new Master();
Pet pets=dx.getPet(xz);
pets.eat();
}
}
instanceof运算符的使用
类型转换比较
1.
子类转换父类
向上转型
自动转换
2.
父类转换子类
向下转型
使用isntanceof用作比较判定
子类 对象名 = (子类)父类;
使用子类对象
栗子:
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*父类 宠物类
*/
public class Pet {
public void eat(){
System.out.println("pet正在吃");
}
}
父类
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*
*/
public class Cat extends Pet {
public void eat(){
System.out.println("猫吃猫粮");
}
public void ball(){
System.out.println("猫玩球");
}
}
Cat 类
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*子类:狗狗类
*/
public class Dog extends Pet{
public void eat(){
System.out.println("狗狗吃狗粮");
}
public void catchFlyDisk(){
System.out.println("狗狗玩飞盘");
}
}
Dog 类
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*企鹅类
*/
public class Penguin extends Pet{
public void eat(){
System.out.println("企鹅吃鱼");
}
public void swiming(){
System.out.println("企鹅游泳");
}
}
Penguin 类
/**
*
*/
package bdqn.javademos;
/**
* @author xjz
*主人类
*/
public class Master {
public void feed(Pet pet){
pet.eat();
}
//领养宠物 多态形式3:父类作为方法返回值,子类实例化 类型自动转换
public Pet getPet(int typeid){
Pet pet=null;
if(typeid==1){
pet=new Dog();
}
else if(typeid==2){
pet=new Penguin();
}
else if(typeid==3)
{
pet=new Cat();
}
return pet;
}
//主人和宠物玩耍的行为
public void play(Pet pet){
if (pet instanceof Dog) {
Dog dog=(Dog)pet;//向下转型
dog.catchFlyDisk();
}else if(pet instanceof Penguin){
Penguin peng=(Penguin)pet;
peng.swiming();
}else if(pet instanceof Cat){
Cat cat=(Cat)pet;
cat.ball();
}
}
}
Master 类
package bdqn.javademos;
import java.util.Scanner;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//多态的形式1
Dog dog=new Dog();
Penguin peng=new Penguin();
Cat cat=new Cat();
Master ms=new Master();
ms.feed(dog);
ms.feed(peng);
ms.feed(cat);
//多态的形式2:父类做类型,子类实例化
Pet pet=new Dog();//自动转换
pet.eat();
//调用领养宠物 形式3:父类作为方法的返回类型
System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅 3-猫) ");
Scanner input=new Scanner(System.in);
int xz=input.nextInt();
Master dx=new Master();
Pet pets=dx.getPet(xz);
pets.eat();
dx.play(dog);
}
}
测试类
(C) 房上的猫 。 保留所有权利。
https://www.cnblogs.com/lsy131479/
如需转载,请注明出处!!!
Java 面向对象三大特征之一: 多态的更多相关文章
- 封装继承多态-java面向对象三大特征
第七章 封装和继承 一.面向对象的三大特征 封装.继承.多态 二.封装 将类的属性(字段)设置为私有的(private),并添加getter/setter方法操作属性. 注意:get|set方法的固 ...
- Java面向对象三大特征
封装: 首先,属性可用来描述同一类事物的特征, 行为可描述一类事物可做的操作,封装就是要把属于同一类事物的共性(包括属性与行为)归到一个类中,以方便使用.比如人这个东东,可用下面的方式封装:人{ 年龄 ...
- 简述Java面向对象三大特征:封装、继承、多态
封装: 把对象的全部属性和服务结合在一起,形成不可分割的独立单位: 尽可能隐藏内部细节.(数据隐藏.隐藏具体实现的细节) public.private.protected.default pu ...
- 面向对象三大特征之多态——Java笔记(七)
多态: 同一个实体同时具有多种形式 编译时的类型有声明该变量时使用的类型决定,运行时的类型有实际赋值给变量的对象决定 如果编译时类型和运行时类型不同,就出现多态 例: clas ...
- JAVA 面向对象 三大特征:继承
什么是继承 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接访 ...
- Java面向对象三大特点之多态
概念: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 多态性是对象多种表现形式的体现,同一个事件发生在不同的对象上会产生不同的结果. ...
- Java学习:面向对象三大特征:封装、继承、多态之封装性
面向对象三大特征:封装.继承.多态. 封装性在Java当中的体现: 方法就是一种封装 关键字private也是一种封装 封装就是将一些细节信息隐藏起来,对于外界不可见. 问题描述:定义Person的年 ...
- JAVA的三大特征 封装继承多态- 简单总结
简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...
- Java中面向对象三大特征
也就是说在这里"人"是多态的, 在不同的形态时,特征行为是不一样的, 这里的"人", 同时有两种形态,一种是教师形态,一种是学生形态,所对应的特征行为分别是&q ...
随机推荐
- pyspider解析
https://www.cnblogs.com/microman/p/6111711.html #!/usr/bin/env python # -*- encoding: utf-8 -*- # Cr ...
- c#目录以及子目录下图片批量缩放,像素不变,图像大小改变
采用多线程,整体效果 图像根目录黏贴或者手工选择,点击开始,进行目录底下图片筛查.采用多线程,点击开始按钮,开启线程,这样UI不会卡住 private void button2_Click(objec ...
- set类型
set 集合 是string类型的无序集合.我们可以对集合去交集 并集 差集 sadd 添加元素 不允许有重复的值 smembers 查看元素中的值 srem 删除set中的值
- python_9_集合
什么是集合? --一种无序,没有重复元素的一种数据类型 -- 形式: {元素1,元素2,......} 如何把一个列表变成一个集合? --set(列表) ...
- JAVA中double类型运算结果异常的解决
问题: 对两个double类型的值进行运算,有时会出现结果值异常的问题.比如: System.out.println(19.99+20); System.out.println(1.0-0.66); ...
- Spring中Quartz的配置及corn表达式
Quartz可以用来执行任务调度功能,如间隔一定时间调用执行任务.用起来还是蛮方便的.只要将你要调用的类配置到Spring配置文件即可. 在Spring的配置文件中配置Quartz. <!-- ...
- spark-shell 显示乱码
用spark shell 进入console环境 查看字符集 scala> System.getProperty("file.encoding") res5: String ...
- JDBC (二)
1 使用JDBC进行批处理 当需要向数据库发送一批SQL语句的时候,应该避免向数据库一条条的发送执行,而应该采用JDBC的批处理机制,以提高执行效率. 实现批处理的方式一: Statement.add ...
- HTML5 拖放(Drag 和 Drop)详解与实例
简介 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 先点击一个小例子:在用户开始拖动 <p> 元素时执行 JavaSc ...
- 《.NET 设计规范》第 8 章:使用规范
第 8 章:使用规范 8.1 数组 要在公共 API 中优先使用集合,避免使用数组. 不要使用只读的数组字段.虽然字段本身是只读的,用户不能修改它们,但用户可以修改数组中的元素. 考虑使用不规则数组, ...