?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
文章目录
前言
一、重写是什么?
二、重载和重写的区别
三.如何理解多态
四.使用多态的好处
总结
前言
刚换了个新的模板,头一回使用,感觉这样写出来比较简洁明了。关于重载重写多态这一块,定义较多,有时候感觉还蛮难理解的,花了两个小时,简单整理归纳了下,如有不当之处,多多指教,也希望自己越来越好。
一、重写是什么?
子类实现父类的同名方法, 并且参数的类型和个数完全相同, 这种情况称为 覆写/重写/覆盖(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();
}
}
总结
以上就是重写和重载的主要区别以及多态的含义以及优势!
|