Java学习笔记(9)--- 重写,重载,多态
1.重写:
a.定义:
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例子:
class animal{
public void move(){
system.out.println("动物可以移动");
} }
class dog extends animal{
public void move(){
system.out.println("狗可以跑和走");
} }
然后我们引用:
animal a = new animal(); // animal 对象
animal b = new dog(); // dog 对象
a.move();// 执行 animal 类的方法
b.move();//执行 dog 类的方法
输出为:
动物可以移动 狗可以跑和走
在上面的例子中可以看到,尽管 b 属于 animal 类型,但是它运行的是 dog 类的 move方法(我们重写的方法)
这是由于在编译阶段,只是检查参数的引用类型。
然而在运行时,java 虚拟机(jvm)指定对象的类型并且运行该对象的方法。
因此在上面的例子中,之所以能编译成功,是因为 animal 类中存在 move 方法,然而运行时,运行的是特定对象的方法。
b.规则:
1.参数列表必须完全与被重写方法的相同。
2.返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类。
3.访问权限不能比父类中被重写的方法的访问权限更低。
4.父类的成员方法只能被它的子类重写。如果在同一包里的子类可以重写所有的父类方法,除了声明为 private 和 final 的方法。
5.声明为 final 的方法不能被重写,而static 的方法不能被重写,但是能够被再次声明。
6.子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
7.重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
2.重载:
跟c++差不多的意思。
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
与重写的不同之处就是重载着重于不同的参数。
3.多态:
a.定义:
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。
学好多态这个概念对应用好接口很重要。
多态的存在的三个必要条件:
1.继承
2.重写
3.父类引用指向子类对象
比如说这个例子,是把一个父类的引用指向了一个子类的对象:
parent p = new child();
注意:使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
b.虚函数:
虚函数是多态的基础之一,当然java所有的函数默认都是c++意义上的虚函数所以不用特别去注意,因为动态绑定是java的默认行为。
如果 java 中不希望某个函数具有虚函数特性,可以加上 final 关键字变成非虚函数。
引用:
上一篇: 2019.07.05 纪中_B
下一篇: C++拷贝构造函数:浅拷贝与深拷贝
推荐阅读