提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

文章目录

前言

一、重写是什么?

二、重载和重写的区别

三.如何理解多态

四.使用多态的好处

总结



前言

刚换了个新的模板,头一回使用,感觉这样写出来比较简洁明了。关于重载重写多态这一块,定义较多,有时候感觉还蛮难理解的,花了两个小时,简单整理归纳了下,如有不当之处,多多指教,也希望自己越来越好。

一、重写是什么?

子类实现父类的同名方法, 并且参数的类型和个数完全相同, 这种情况称为 覆写/重写/覆盖(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(); 
 } 
}


总结

以上就是重写和重载的主要区别以及多态的含义以及优势!