方法的重写和重载可是java的经典面试题,每次一刷八股文都有它们。
一、方法的重写(覆盖)介绍
1)方法的重写定义:
在子类中可以根据需要对从父类中继承来的方法进行改造,也称 为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
2)方法的重写要求:
-
子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
-
子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
-
子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限 (子类不能重写父类中声明为private权限的方法 )
-
子类方法抛出的异常不能大于父类被重写方法的异常
代码例子:
public class Animal{
public void cry(){
System.out.println("动物叫唤");
}
public Object g1(){
return null;
}
public String g2(){
return null;
}
public void g3(){
return null;
}
}
public Dog extends Animal{
public void cry(){
System.out.prinln("小狗汪汪叫");//这个就和上面Animal的cry方法构成了重写
}
public String g1(){
return null;//这个和上面的g1构成了重写因为String类是Object的子类
}
public Object g2(){
return null;//这个没有重写上面的g2方法,因为子类的Object比父类的String返回值类型大
}
private void g3(){
return null;//子类中的g3()的访问权限private比被覆盖方法的访问权限public小编译器直接报错
}
}
二、方法重载介绍
1)重载的概念 :
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数 类型不同即可。
2)重载的特点:
与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类 型)。调用时,根据方法参数列表的不同来区别。
3)重载的好处:
-
减轻了起名的麻烦
-
减轻了记名的麻烦
4)注意事项和使用细节:
1、方法名必须相同
2、形参类型必须不同(形参类型或个数或顺序,至少有一样不同)
3、返回类型无要求
例子:
与void show(int a,char b,double c){}构成重载的有:
a) void show(int x,char y,double z){} // no (形参值都不一样因此没有构成重载)
b) int show(int a,double c,char b){} // yes (形参顺序不一样,返回值不一样构成了重载)
c) void show(int a,double c,char b){} // yes (形参顺序不一样构成了重载)
d) boolean show(int c,char b){} // yes (形参个数不一样,返回值不一样构成了重载)
e) void show(double c){} // yes (形参个数不一样构成了重载)
f) double show(int x,char y,double z){} // no (形参值都不一样因此没有构成重载)
g) void shows(){double c} // no** (方法名不一样直接编译器报错)
三、重写与重载之间的区别
总结
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
-
(1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
-
(2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
-
(3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。