Java的重写和重载

一、重写(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、重载规则

被重载的方法必须方法名相同,必须改变参数列表(参数个数或类型不一样)
被重载的方法可以改变访问修饰符,可以改变返回类型

三、总结

方法重载是一个类的多态性的表现,方法重写是父类和子类的一种多态性表现
方法重载是在一个类中定义多个方法名相同,而参数类型、数量或次序不同的方法。
方法重写是在子类中存在与父类的方法的方法名相同、参数相同、返回类型可以不同的方法。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cw旧巷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值