>[success] # 多态
1. 多态主要指同一种事物表现出来的多种形态
>[danger] ##### 多态语法格式
~~~
父类类型 引用变量名 = new 子类类型();
~~~
例如
~~~
Shape sr = new Rect()
~~~
>[danger] ##### 多态特点
1. 当父类类型的引用指向子类类型的对象时,父类类型的引用可以直接调用**父类独有的方法**
2. 当父类类型的引用指向子类类型的对象时,父类类型的引用不可以直接调用**子类独有的方法**
3. 对于父子类都有的非静态方法来说,编译阶段调用父类版本,运行阶段调用子类重写的版本(**动态绑定**)
4. 对于父子类都有的静态方法来说,编译和运行阶段都调用**父类版本**
>[danger] ##### 案例
~~~
1.编程实现Shape类的封装,特征有:横纵坐标,要求提供打印所有特征的方法。
2.编程实现Rect类的封装并继承自Shape类,特征有:长度和宽度。
3.编程实现ShapeRectTest类,在main方法中分别创建Shape和Rect类型对象并打印特征。
~~~
* 父类Shape
~~~
public class Shape {
private int x;
private int y;
public Shape() {
}
public Shape(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void show(){
System.out.println("横坐标"+getX()+"纵坐标"+getY());
}
}
~~~
* 子类
~~~
public class Rect extends Shape{
private int len;
private int wid;
public Rect() {
}
public Rect(int x, int y, int len, int wid) {
super(x, y);
this.len = len;
this.wid = wid;
}
public int getLen() {
return len;
}
public void setLen(int len) {
if(len>0){
this.len = len;
}else{
System.out.println("长度不能为负数");
}
}
public int getWid() {
return wid;
}
public void setWid(int wid) {
if(wid>0){
this.wid = wid;
}else{
System.out.println("宽度不能为负数");
}
}
@Override
public void show() {
super.show();
System.out.println("长度"+getLen()+"宽度是"+getWid());
}
}
~~~
* 运行入口
~~~
public class ShapeRectTest {
// 此时传入参数不一定是Rect 或者是Shape其他子类型,但如果类型写死需要
// 利用重载写多次对应类型,利用了多态此时一个入口方法即可
public static void getShow(Shape sr){
sr.show();
}
public static void main(String[] args){
// 声明 Shape 类型
Shape shape = new Shape(1,2);
shape.show();
System.out.println("---------------------");
// 声明 Rect 类型
Rect rect = new Rect(3,4,5,6);
// 如果子类没有重写父类的show 方法此时用是父类show方法
rect.show();
System.out.println("---------------------");
// 声明 Shape 类型指向 Rect
Shape sr = new Rect(7,8,9,10);
// 如果子类没有重写父类的show 方法此时用是父类show方法
// 如果子类重写父类的show ,在编译阶段使用是父类show方法,在执行阶段执行的子类show方法
sr.show();
// 使用多态特性
ShapeRectTest.getShow(new Rect(7,8,9,10));
ShapeRectTest.getShow(new Shape(7,8));
}
}
~~~
>[danger] ##### 多态意义
1. 多态的实际意义在于屏蔽不同子类的差异性实现通用的编程带来不同的效果
2. 使用多态的格式,此时父类类型引用直接调用的所有方法一定是父类中拥有的方法,若以后更换子类时,只需要将new关键字后面的子类类型修改而其它地方无需改变就可以立即生效,从而提高了代码的可维护性和可扩展型。
~~~
// 如果以后代码编写时候使用多态向上转型后,此时未来代码将要有改动更换类时候
// 只需将new 部分改动例如 Shape s = new Rect() 改 Shape s = new Clire(); 但下面的调用方法
// 无需更调用 或作为方法参时候去给改整体
Shape s = new Rect()
s.getShow()
~~~
* 缺点
1. 父类引用不能直接调用子类独有的方法,若调用则需要强制类型转换
- windows -- 环境变量
- Vscode -- 编写java
- 初始java
- java -- 关键字
- 编写第一个java程序
- java -- 注释
- 计算机存储 -- 进制
- java -- 类型
- java -- 变量
- 数字类型
- 布尔类型
- 字符类型
- 类型转换
- 双等比较是什么
- java -- 运算符
- 算数运算符
- 字符串拼接
- 关系/比较运算符
- 自增减运算符
- 逻辑运算符
- 三目运算
- 赋值运算符
- 移位运算符
- 位运算符
- 运算符优先级
- java -- 流程控制语句
- if /else if /if -- 判断
- switch case分支结构
- for -- 循环
- 用双重for循环
- while -- 循环
- do while -- 循环
- 案例练习
- java -- 数组
- 数组的存储
- 数组的增删改查
- 数组的特点
- 数组案例
- 二维数组
- 数组的工具方法
- java -- 方法
- java -- 方法的重载
- java -- 方法的调用流程
- java -- 类方法传参注意事项
- java -- 方法练习案例
- 对比 return break continue
- for each循环
- java -- 基础练习
- java -- 面向对象
- java -- 创建类和对象
- java -- 访问控制符
- java -- 类成员方法
- java -- 构造方法
- java -- this
- java -- 封装
- java -- 对象内存图
- java -- 创建对象案例
- java -- static
- java -- 继承
- super -- 关键字
- java -- 构造块和静态代码块
- java -- 重写
- java -- final
- java -- 多态
- java -- 抽象类
- java -- 接口
- 引用类型数据转换
- 综合案例
- java -- 内部类
- java -- 回调模式
- java -- 枚举类型
- java -- switch 使用枚举
- java -- 枚举方法使用
- java -- 枚举类实现接口
- java -- javaBean
- java -- package 包
- java -- import
- java -- 递归练习
- java -- 设计模式
- 单例模式
- java -- 注解
- java -- 元注解
- Java -- 核心类库
- java -- 处理字符串
- Java -- String
- String -- 常用方法
- String -- 正则
- Java -- StringBuilder 和 StringBuffer
- 知识点
- Java -- StringJoiner 字符串拼接
- 练习题
- 字符串的总结
- Java -- 包装类
- Integer
- Double
- Boolean
- Character
- java -- 集合类
- java -- util.Collection
- Iterator接口
- java -- util.List
- java -- ArrayList
- java -- util.Queue
- java -- util.Set
- java -- util.Map
- java -- util.Collections
- Java -- Math
- Java -- java.lang
- Java -- Object
- Java -- 获取当前时间戳
- Java -- 异常
- Java -- java.util
- java -- Date
- java -- Calender
- Java -- java.text
- Java -- SimpleDateFormat
- Java -- java.time
- Java -- java.io
- java -- io.File
- java -- 泛型
- IDEA -- 用法