一、重写(Override)
重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。
废话不多说,直接上代码,看起来更清晰。
class Animal{
public void eat(){
System.out.println("动物要吃饭");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗要吃粑粑");
}
}
public class Test{
public static void main(String [] args){
//创建 Animal 对象
Animal animal=new Animal();
//创建 Dog 对象
Animal dog=new Dog();
//执行 Animal 类的eat方法
animal.eat();
//执行 Dog 类的eat方法
dog.eat();
}
}
运行结果如下:
动物要吃饭
狗要吃粑粑
我们来分析一下上边的程序,虽然 dog 属于 Animal 类型,但是它运行的是 Dog 的eat 方法。这是因为在编译阶段,只是检查参数的引用类型。但是在运行阶段,Java虚拟机(JVM)会指定对象的类型并且运行该对象的方法。
下边我们举一个反例
class Car{
public void run(){
System.out.println("汽车可以跑");
}
}
class Lamborghini extends Car{
public void run(){
System.out.println("兰博基尼可以跑的很快");
}
public void costly(){
System.out.println("你买不起兰博基尼,还不快好好学习!");
}
}
public class Test1{
public static void main(String [] args){
//创建汽车对象
Car car=new Car();
//创建兰博基尼对象
Car L=new Lamborghini();
car.run();
L.run();
L.costly();
}
}
上边的代码直接会报error:
The method costly() is undefined for the type Car
1、方法的重写规则
父类的成员方法只能被子类重写,父类的构造方法不能被重写。(重写适用于继承)
重写的方法的参数列表与被重写方法的参数列表必须完全一致,重写的方法的返回类型可以与被重写方法不相同。
父类声明为 final/static 的方法不能被重写,但是 static 可以被再次声明。
重写的方法不能抛出新的强制性异常,或者比被重写的方法声明的更广泛的强制性异常
2、Super关键字的使用
当需要在子类中调用父类的被重写的方法时,需要使用 super 关键字
直接上代码,在上边动物类的基础上
class Animal{
public void eat(){
System.out.println("动物要吃饭");
}
}
class Dog extends Animal{
public void eat(){
super.eat();
System.out.println("狗要吃粑粑");
}
}
public class Test{
public static void main(String [] args){
//创建 Dog 对象
Animal dog=new Dog();
//执行 Dog 类的eat方法
dog.eat();
}
}
运行结果如下:
动物要吃饭
狗要吃粑粑
二、重载(Overload)
重载是在一个类里边,方法名相同,参数不同,返回类型可以相同也可以不同。
废话不多说,先上代码:
public class Test1 {
//返回值类型和参数列表不同
public void test() {
System.out.println("我是test1");
}
public int test(int a) {
System.out.println("我是test2");
return a;
}
// 以下两个参数类型顺序不同
public String test(int a, String s) {
System.out.println("我是test3");
return s+a;
}
public String test(String s, int a) {
System.out.println("test4");
return s+a;
}
public static void main(String[] args) {
Test1 test1 = new Test1();
test1.test();
System.out.println(test1.test(8));
System.out.println(test1.test(1, "00"));
System.out.println(test1.test("11", 0));
}
}
运行结果如下:
我是test1
我是test2
8
我是test3
001
test4
110
1、重载规则
被重载的方法必须方法名相同,必须改变参数列表(参数个数或类型不一样)
被重载的方法可以改变访问修饰符,可以改变返回类型
三、总结
方法重载是一个类的多态性的表现,方法重写是父类和子类的一种多态性表现
方法重载是在一个类中定义多个方法名相同,而参数类型、数量或次序不同的方法。
方法重写是在子类中存在与父类的方法的方法名相同、参数相同、返回类型可以不同的方法。