一.重写
子类实现父类的同名方法,并且参数的类型和个数完全相同,这种情况称为覆写/重写/覆盖
重写的规则:
①返回类型相同
②方法名相同
③参数相同
重写要注意的事项:
①普通方法可以重写,static修饰的静态方法不能重写
②重写中子类的方法的访问权限不能低于父类的方法访问权限
参考代码:
//Animal父类
class Animal{
public String name;
public Animal(String name){ //父类构造
this.name=name;
}
public void eat(){ //父类eat方法
System.out.println(this.name+"Animal eat:()");
}
}
//定义Cat类继承Animal
class Cat extends Animal{
public String sex; //子类属性
public Cat(String name,String sex){ //构造方法
super(name);
this.sex=sex;
}
@Override //重写注解
public void eat() { //对父类eat方法进行重写
System.out.println(this.name+this.sex+"Cat eat:()");
}
}
public class Test {
public static void main(String[] args) {
Cat cat= new Cat("花花", "女");
cat.eat();
}
}
//打印结果
花花女Cat eat:()
针对重写的方法,可以使用 @Override注解显式指定,
有了注解,就可以进行合法性校验,假如不小心将方法名拼写错了, 此时编译器就会发现父类中没有此方法,编译报错,提示无法构成重写。
二.重载
有时候需要用一个函数同时兼容多种参数的情况,就可以使用方法的重载(同一个方法名字,提供不同版本的实现,称为方法重载) 补充:构造方法也可以重载
重载规则:
①方法名相同
②参数列表不同(个数和类型)
③返回值类型不作要求
④必须在同一个类中
参考代码:
class Test{
public static void main(String[] args) {
int a=10;
int b=20;
int i=add(a,b);
System.out.println(i);
double a2=10.5;
double b2=12.5;
double i2=add(a2,b2);
System.out.println(i2);
}
public static int add(int x,int y){
return x+y;
}
public static double add(double x,double y){
return x+y;
}
}
//打印结果
30
23.0
上述代码中有两个add方法,当主函数中调用add方法时,通过传入的参数不同,可以确定调用哪个重载方法。先找严格匹配,再找兼容匹配。
参考代码:
class Test{
public static void main(String[] args) {
char a=10;
char b=20;
add(a,b);
float a2=10.5f;
float b2=12.5f;
add(a2,b2);
}
public static void add(int x,int y){
System.out.println(x+y);
}
public static void add(double x,double y){
System.out.println(x+y);
}
}
//打印结果
30
23.0
观察上述代码可以发现char类型的调用了参数类型为int类型的方法,而float调用了参数类型为double的方法,这是因为char类型的参数没有严格可以匹配的参数类型,所以就会将char提升为int类型(找兼容类型)再调用add。float被提升为double类型再进行调用方法。
小结: