目录
1.认识方法重写
在认识方法重写之前,我们先来看一段代码:
父类Animals class Animals{ String name; int age; public void eat(){ System.out.println("正在吃饭"); } } 子类Dog class Dog extends Animals{ ... } 子类Cat class Cat extends Animals{ ... }
还是一样,创建了一个父类Animals,两个子类Dog(狗)和Cat(猫),父类里面的eat()成员方法,可以供两个子类使用,但是,不论是狗还是猫,都是吃饭吗??你别忘了,狗是吃狗粮的,猫是吃猫粮的,我都去调用同一个eat(),就不太好了,那怎么办呢?
那我就在子类里面重写一个eat()方法呗,如下
动物 class Animals{ String name; int age; 原本的eat() public void eat(){ System.out.println("正在吃饭"); } } 狗 class Dog extends Animals{ 在子类里重写eat() public void eat(){ System.out.println("吃狗粮"); } } 猫 class Cat extends Animals{ 重写eat() public void eat(){ System.out.println("吃猫粮"); } }
我在子类里重写了一遍eat方法,我现在调用一下,
这里我为了简洁,省略了main方法
Dog dog1 = new Dog();
Cat cat1 = new Cat();
dog1.eat();
cat1.eat();
运行的结果为:
你发现,我在子类里重写了父类的eat()方法后,我再去调用,调用的是重写后的方法,这就是方法重写,方法重写也叫方法覆盖,意思就是子类重写父类的方法,让子类对象调用该方法的时候,调用的是重写后的方法
2.方法重写的规则
(1).方法名,参数列表,返回值必须要相同
(2).方法的内容可以不同
3.方法重写的一些注意事项
(1).被private、static、final修饰的方法不能被重写,还有构造方法也不能被重写
(2).子类的访问权限一定要大于等于父类的访问权限
如图:
(3).返回值其实可以不同,但必须是父子类关系
如图
当不是父子类关系时
当是父子类关系时
总的来说,你的重写之后返回值类型,要么相同,要么和原来的返回值类型成父子类关系
(4).@Override注释的使用
在重写的方法前面加上这行注释,当你出现一些低级错误时,比如方法名写错了等等,编译器自动会报错,让你很容易就会发现,例如:
4.方法重写与方法重载的区别
方法重写的方法名、参数列表(参数个数、参数顺序、参数类型)、返回值类型(除了具有父子类关系的类型)必须都要相同
方法重载只需要方法名相同、其余都可以不同,而且至少要有一样不同
5.动态绑定与静态绑定
1.静态绑定
静态绑定是在编译时确定对象的类型和绑定的方法,编译器会根据调用的方法名和对象的类型确定要调用哪个方法。这种绑定方式在程序运行时效率高,但缺点是不够灵活,无法处理对象的多态性。
静态绑定的一个典型例子就是方法重载,在编译代码的时候,编译器就会根据重载的几个方法的参数列表和返回值类型来判断,我要调用的是哪个方法,简单来说就是编译时绑定。
2.动态绑定
动态绑定则是在运行时根据对象的实际类型确定要调用哪个方法,能够处理对象的多态性。动态绑定通常需要使用虚函数或接口实现。在动态绑定中,编译器不知道要调用哪个方法,而是在程序运行时根据对象的实际类型进行绑定。
动态绑定的典型例子就是方法重写,在编译代码的时候,不确定要调用哪个方法,只有到了运行的时候,才能够确定具体要调用的那个方法,简单来说就是运行时绑定。