多态!
时间:2019-09-29
本文章向大家介绍多态!,主要包括多态!使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
多态
java中如何实现多态?使用多态的好处?
引用变量的两种类型:
编译时类型(模糊一点,一般是一个父类)
public void (Pet pet);
由声明时的类型决定。
运行时类型(运行时,具体是哪个子类就是哪个子类)
由实际对应的对象类型决定。
多态的存在要有3个必要条件:
要有继承,要有方法重写,父类引用指向子类对象
为什么有重写?
父类引用指向子类对象一定用父类对象去调用子类方法,
调用的一定是被重写的方法。
为什么需要多态(封装以及继承)
1.多态
提高了程序的可扩展性和可维护性
提高代码复用性
2.封装
安全
提高代码复用性
3. 继承
提高代码复用性
多态的用2种表现形式
1.父类作为方法的参数
public 返回值类型 方法名(父类类型 对象名){ } public void feed (Pet pet){ }
2.父类作为方法返回值(又称为工厂设计模式)
父类作为方法的返回值类型 public Pet getPet(int type) { // 声明一个pet对象 Pet pet = null; switch (type) { case 1: // 父类的引用指向子类的对象 pet = new Dog("旺财",2,60,"金毛"); break; }
具体应用:(以下代码都省去构造器和set,get设置器)
public class Cat extends Pet{
private String color;
@Override
public void eat() {
System.out.println("猫在吃鱼");
}
@Override
public void bark() {
System.out.println("miao miao miao");
}
}
public class Dog extends Pet{
private String brand;
@Override
public void eat() {
System.out.println("狗在吃骨头");
}
@Override
public void bark() {
System.out.println("won won won");
}
}
public abstract class Pet { private String name; private int age; private int love; private int health; public abstract void eat(); public abstract void bark(); }
2种多态的用法如下彩色字段
public class Person { /** * 领养宠物的方法 * 父类的类型作为方法返回值的类型 * @return */ public Pet getPet() { Scanner input = new Scanner(System.in); System.out.println("请输入索要领养的宠物的类型 1,狗 2,猫 3,猪"); int type = input.nextInt(); Pet pet = null; if (type == 1) { pet = new Dog(); }else if(type == 2){ pet = new Cat(); }else { pet = new Pig(); } return pet; } public void feed(Pet pet) { pet.eat(); } }
public class Test { public static void main(String[] args) { Person xiaoming = new Person(); Pet pet = xiaoming.getPet(); System.out.println(pet); xiaoming.feed(pet); } }
pig类可以看出多态的可扩展性
public class Pig extends Pet{ @Override public void eat() { System.out.println("猪在吃白菜"); } @Override public void bark() { System.out.println("heng 哼"); } }
原文地址:https://www.cnblogs.com/hsh5201314/p/11610440.html
- 碎片化 | 第四阶段-43-struts2拦截器interceptor-视频
- Spring Cloud Edgware新特性之二:如何配置Zuul的Hystrix线程池
- 碎片化 | 第四阶段-44-struts2注解使用-视频
- Spring Cloud Edgware新特性之:解决Eureka中Jersey 1.x版本过旧的问题-不使用Jersey
- 如何自定义微服务的Instance ID
- 怎样做情感分析
- Python|编写自己的类
- 碎片化 | 第四阶段-45-session为空问题解决-视频
- 以后有机会写框架用得着的
- 合并两个不相关的Git仓库
- 用 Tensorflow 建立 CNN
- 碎片化 | 第四阶段-36-struts-spring结合jdbc实现删除功能-视频
- 跨域访问支持(Spring Boot、Nginx、浏览器)
- 自己动手写个聊天机器人吧
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Saltstack_使用指南18_API
- Centos7安装单机版Redis
- Vue3 Composition-Api + TypeScript + 新型状态管理模式探索。
- Saltstack_实战指南01_系统规划
- Saltstack_实战指南02_各主机Pillar信息指定
- TypeScript基础看腻了?进阶实现智能类型推导的简化版Vuex,手把手带你实现。
- Linux下使用 github+hexo 搭建个人博客01-hexo搭建
- Linux下使用 github+hexo 搭建个人博客02-hexo部署到Github Pages
- Linux下使用 github+hexo 搭建个人博客03-hexo配置优化
- 接口测试框架实战(五) | 测试数据的数据驱动
- Linux下使用 github+hexo 搭建个人博客04-next主题优化
- Linux下使用 github+hexo 搭建个人博客05-next主题接入评论系统 来必力畅言Valine获取 livere_uid在Next主题配置浏览器访问数据
- Linux下使用 github+hexo 搭建个人博客06-next主题接入数据统计
- egg.js 动态转发代理
- Linux下使用 github+hexo 搭建个人博客07-next主题接入搜索和站点管理