文章目录
- 📑前言
- 一、重写
- 1.1 概念
- 1.2 方法重写的规则
- 1.3 重写和重载的区别
- 1.4 重写的设计原则
- 二、动静态绑定
- 2.1 静态绑定:
- 2.2 动态绑定:
- 🌤️全篇总结
📑前言
在面向对象编程中,重写和动静态绑定是重要的概念,影响着代码的执行流程和行为。通过重写,子类可以重新实现父类的方法,实现个性化的行为;而动静态绑定则决定了方法调用时的具体行为。本文将深入探讨重写的规则、设计原则以及动静态绑定的概念和条件,帮助您更好地理解和运用这些概念在Java编程中的重要性和实际应用。
一、重写
1.1 概念
重写(override):
也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
1.2 方法重写的规则
子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致
被重写的方法返回值类型可以不同,但是必须是具有父子关系的
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected
父类被static、private修饰的方法、构造方法都不能被重写。
重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写
1.3 重写和重载的区别
区别点 | 重写(override) | 重载(override) |
---|---|---|
参数列表 | 一定不能修改 | 必须修改 |
返回类型 | 一定不能修改【除非可以构成父子类关系】 | 可以修改 |
访问限定符 | 一定不能做更严格的限制(可以降低限制) | 可以修改 |
方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现
1.4 重写的设计原则
对于已经投入使用的类,尽量不要进行修改。最好的方式是:重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容。
二、动静态绑定
2.1 静态绑定:
也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载。
静态绑定的条件包括:
- 变量的声明类型:静态绑定是根据变量的声明类型来决定调用哪个方法。因此,变量的声明类型必须是确定的,不能是多态类型。
- 编译时类型确定:在编译阶段,编译器会根据变量的声明类型来确定调用的方法,而不考虑实际运行时的对象类型。
2.2 动态绑定:
也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。
动态绑定的条件包括:
- 方法的重写:动态绑定需要存在父类和子类之间的方法重写,即子类重写了父类的方法。
- 发生向上转型:Animal animal = new Dog
- 父类引用:通过父类引用来调用父类和子类的重写方法。
🌤️全篇总结
通过本篇你已经了解了重写和动静态绑定在面向对象编程中的重要性和实现条件。重写可以让子类根据需要重新定义父类的方法,实现个性化的行为;而动静态绑定则决定了方法调用时的具体行为,静态绑定在编译时确定调用方法,而动态绑定在运行时确定调用方法。