Java-方法重载、方法重写以及如何判断
一、方法重载(overload)
两同一不同:两同是指同一个类、方法名相同,一不同是指参数列表不同。
是否为方法重载该如何区分?如下代码验证:
class MethodOverload {
//方法1
public void people(){
System.out.println("刘备还是忠厚人呐");
}
//方法2
public void people(String name){
System.out.println("姓名:" + name);
}
//方法3
public void people(String name,String behavior){
System.out.println(name + "," + behavior);
}
//方法4
public void people(String name,int age){
System.out.println("姓名:" + name + ",年龄:" + age);
}
//方法5
public void people(int age,String name){
System.out.println("姓名:" + name + ",年龄:" + age);
}
/*------------------------------------------------------------
public String people(int age,String name){
System.out.println("姓名:" + name + ",年龄:" + age);
return name;
此方法和方法5相比较,仅返回值类型不同,但编译报错,下面的方法6使参数列表不同后可编译成功
}
------------------------------------------------------------*/
//方法6
public String people(int age,String name,String behavior){
System.out.println("姓名:" + name + ",年龄:" + age + behavior);
return behavior;
}
/*------------------------------------------------------------
protected String people(int age,String name,String behavior){
System.out.println("姓名:" + name + ",年龄:" + age + behavior);
return behavior;
此方法和方法6相比较,仅修饰符不同,但编译报错,下面的方法7使参数列表不同后可编译成功
}
------------------------------------------------------------*/
//方法7
protected String people(int age,String name,double salary){
System.out.println("姓名:" + name + ",年龄:" + age);
return name;
}
}
class MethodOverloadTest extends MethodOverload{
public static void main(String[] args) {
MethodOverload mo = new MethodOverload();
mo.people();
mo.people("刘备");
mo.people("刘备",300);
mo.people(300,"刘备");
mo.people(300,"刘备","织席贩履");
mo.people(300,"关羽",5000000.0);
}
}
解释: 首先前提是方法名相同,且在同一个类中;然后方法1到方法5,通过控制变量,验证得到:参数列表不同包括个数、类型、顺序,方法1、2、3说明参数列表需要个数不同,方法3、4说明参数列表需要类型不同,方法4、5说明参数列表需要前后顺序不同;结合以上代码中方法5和它下面的注释表明:仅返回值类型不同不构成重载;结合以上代码中方法6和它下面的注释表明:仅修饰符不同也不构成重载。
总结: 判断是否为方法重载:判断得到同一类、方法名相同、参数列表不同即可,修饰符和返回类型无影响。
二、方法重写(override)
当子类发现父类方法不适合自己时,需要重写父类的方法。
2同2小1大:2同是指方法名相同、形参列表相同;2小是指返回值类型相同或更小、抛出的异常更小;1大访问权限相同或更大。
如下代码示例:
class Human{
public Object live(String name){
return name + "会使用工具";
}
}
class Asian extends Human{
public void smart(String skincolor){
System.out.println("聪明");
}
//重写父类的live()方法
@Override
public String live(String name){
return name + "数学天赋强";
}
}
class BlackPepple extends Human{
public void dance(String skincolor){
System.out.println("善舞");
}
//重写父类的live()方法
// @Override
// public String live(String name){
// return name + "舞蹈天赋强";
// }
}
class HumanTest{
public static void main(String[] args) {
Human h1 = new Human();
System.out.println(h1.live("人类")); //输出“人类会使用工具”
Asian a1 = new Asian();
System.out.println(a1.live("黄种人")); //输出“黄种人数学天赋强”
BlackPepple b1 = new BlackPepple();
System.out.println(b1.live("非洲人")); //输出“非洲人会使用工具”
/*以上代码,若重写了父类的方法,那它的实例优先使用重写后的,若没有重写父类的方法,它的实例会使用父类的方法*/
}
}
@Override注释,表示重写,编译时会验证此方法是否为父类所有,没有则报错,不符合方法重写规范也会报错。