提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
文章目录
前言
一、重写是什么?
二、重载和重写的区别
三.如何理解多态
四.使用多态的好处
总结
前言
刚换了个新的模板,头一回使用,感觉这样写出来比较简洁明了。关于重载重写多态这一块,定义较多,有时候感觉还蛮难理解的,花了两个小时,简单整理归纳了下,如有不当之处,多多指教,也希望自己越来越好。
一、重写是什么?
子类实现父类的同名方法, 并且参数的类型和个数完全相同, 这种情况称为 覆写/重写/覆盖(Override).
关于重写的注意事项
1. 重写和重载完全不一样 . 不要混淆 ( 思考一下 , 重载的规则是啥 ?)
2. 普通方法可以重写 , static 修饰的静态方法不能重写 .
3. 重写中子类的方法的访问权限不能低于父类的方法访问权限 .
4. 重写的方法返回值类型不一定和父类的方法相同 ( 但是建议最好写成相同 , 特殊情况除外 )
二、重载和重写的区别
这里简单说下和重写的区别
重载和重写的区别
区别 | 重载 | 重写 | |
第一点 | 概念 | 方法名称相同,参数类型和个数不同 | 方法名称、返回值类型,参数类型以及个数完全相同 |
第二点 | 范围 | 一个类 | 继承关系 |
第三点 | 限制 | 无权限要求 | 被重写的方法不能有比父类更严格的访问权限 |
三.如何理解多态
在这个代码中 , 分割线上方的代码是 类的实现者 编写的 , 分割线下方的代码是 类的调用者 编写的 .
当类的调用者在编写 drawMap 这个方法的时候 , 参数类型为 Shape ( 父类 ), 此时在该方法内部并 不知道 , 也不关注 当前的 shape 引用指向的是哪个类型 ( 哪个子类 ) 的实例 . 此时 shape 这个引用调用 draw 方法可能会有多种不同的表现,这种行为就称作多态。
代码如下(示例):
class Shape {
public void draw() {
// 啥都不用干
}
}
class Cycle extends Shape {
@Override
public void draw() {
System.out.println("○");
}
}
class Rect extends Shape {
@Override
public void draw() {
System.out.println("□");
}
}
class Flower extends Shape {
@Override
public void draw() {
System.out.println("♣");
}
}
/我是分割线//
// Test.java
public class Test {
public static void main(String[] args) {
Shape shape1 = new Flower();
Shape shape2 = new Cycle();
Shape shape3 = new Rect();
drawMap(shape1);
drawMap(shape2);
drawMap(shape3);
}
// 打印单个图形
public static void drawShape(Shape shape) {
shape.draw();
}
}
四.使用多态的好处
1) 类调用者对类的使用成本进一步降低 .
封装是让类的调用者不需要知道类的实现细节 .
多态能让类的调用者连这个类的类型是什么都不必知道 , 只需要知道这个对象具有某个方法即可 .
因此 , 多态可以理解成是封装的更进一步 , 让类调用者对类的使用成本进一步降低 .
这也贴合了 << 代码大全 >> 中关于 " 管理代码复杂程度 " 的初衷 .
2) 能够降低代码的 " 圈复杂度 ", 避免使用大量的 if - else
例如我们现在需要打印的不是一个形状了 , 而是多个形状 . 如果不基于多态 , 实现代码如下:
public static void drawShapes() {
Rect rect = new Rect();
Cycle cycle = new Cycle();
Flower flower = new Flower();
String[] shapes = {"cycle", "rect", "cycle", "rect", "flower"};
for (String shape : shapes) {
if (shape.equals("cycle")) {
cycle.draw();
} else if (shape.equals("rect")) {
rect.draw();
} else if (shape.equals("flower")) {
flower.draw();
}
}
}
如果使用使用多态 , 则不必写这么多的 if - else 分支语句 , 代码更简单
public static void drawShapes() {
// 我们创建了一个 Shape 对象的数组.
Shape[] shapes = {new Cycle(), new Rect(), new Cycle(),
new Rect(), new Flower()};
for (Shape shape : shapes) {
shape.draw();
}
}
总结
以上就是重写和重载的主要区别以及多态的含义以及优势!