简述重写和重载,java多态
重载和重写的区别
java中方法的重载和重写都是实现多态的一种方法,区别在于前者实现多态是在编译时,后者实现多态是在运行时。
----重写(覆盖)-----
重写的前提是继承,子类重写父类方法的实现过程,方法重写参数类型、个数、顺序必须完全一致。 的主要作用是,根据子类的需要,可以确定属于子类的特定行为。 这也是java多态性的实现方法之一。
例:首先建立动物班。 这个类有一个move方法
公共类动画{
公共语音移动() {
System.out.println (动物在奔跑);
}
}
我们还会制造猫类,猫类继承动物类,重写move方法
公共类cat扩展动画{
@Override
公共语音移动() {
System.out.println ('猫可以跑也可以走) );
}
}
此子类的move方法的方法名称与父类相同,参数均为空,因此作为子类的猫类的move方法是重写父类的move方法
公共类测试{
publicstaticvoidmain (字符串[ ] args ) {
Animal a=new Animal (;
Animal b=new Cat (;
a.move (; //执行父类animal的move方法
b.move (; 执行//子类cat的move方法
}
}
输出结果:
表示在运行时,jvm执行了用特定对象b重写的move方法
方法改写规则总结
父类的成员方法只能由其子类重写。 继承是改写的前提
参数列表和已重写方法的参数列表必须完全相同
访问权限不能低于父类的重写方法。 父类的方法权限修饰符
对于public,子类方法重写的修饰符权限不能小于public (
受保护)
声明为final的方法不可重写
声明为static的方法不可重写,但可以再次声明
如何构建子类不可重写的父类
无论重写的方法是否抛出异常,重写的方法都可以抛出任何非强制异常。 但是,
重写的方法不能抛出新的强制异常,也不能比重写的方法声明的强制异常更广泛
异常,相反很好
如果子类和父类位于同一包中,则子类可以复盖父类的所有方法。 但是,除非声明如下:
隐私和财务方法
如果子类和父类不在同一包中,则子类只能将父类的声明改写为公共和
保护性的非final方法
返回类型可以与重写方法的返回类型不同,但父类必须是返回值的派生类。 (java5和更早版本的返回类型可以相同,而java7和更高版本可以不同。 )
super关键字
子类重写父类的方法后,必须使用super关键字才能重写原始父类的方法
示例:
公共类动画{
公共语音移动() {
System.out.println (动物在奔跑);
}
}
公共类cat扩展动画{
@Override
公共语音移动() {
super.move (;
System.out.println ('猫可以跑也可以走) );
}
publicstaticvoidmain (字符串[ ] args ) {
Animal a=new Cat (;
a.move (;
}
}
运行后,可以看到调用了在父类中重写之前的方法
重载(Overload )
重载在同一个类中进行,同种中方法名相同,但参数不同的方法是重载方法,返回值类型不一定相同。 每个重载方法都必须满足唯一的参数列表。 这是确定jvm执行哪个方法的关键。
公共类开销{
//返回值因参数而异
公共int test1 () {
返回1;
}
公共语音测试2 (inta ) {
系统. out.println (a;
}
//返回值类型相同,参数顺序不同
公共语音测试3 (inta,String b ) {
system.out.println(ba;
}
公共语音测试4 (stringa,int b ) {
system.out.println(ab;
}
publicstaticvoidmain (字符串[ ] args ) {
板载overload=new overload (;
system.out.println (overload.test1 );
overload.test2(2;
Overload.test3(3,' c ';
Overload.test4('d ',4 );
}
}
执行结果:
重载规则
返回类型不是重载函数的区分标准,重载方法可以更改或不更改返回类型
重载的方法需要修改参数列表。 (参数的数量、类型和顺序至少有一个不同。)。
重新加载的方法可以更改访问修饰符
重载方法可以声明新的或更宽的检查异常
方法重载只发生在同一个类中
不同点
重载
重写
返回类型
可以修改
绝对不能修改
参数列表
必须修改
绝对不能修改
异常
可以修改
可以减少或删除,但不能抛出新的或更宽的异常
访问权限
可以修改
不能变更为更严格的限制,可以降低限制