章节五、7-方法的重写
一、重写
子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写,方法重写又称方法覆盖。
二、案例演示
1、新建一个类名为CarsOverridingParent的类,用作父类
package introduction7; public class CarsOverridingParent { public void engineStart(int cly) { System.out.println("这是父类。。。"); } }
2、新建一个类名为CarsOverridingBMW的类,继承CarsOverridingParent,用于对父类中的方法进行重写
package introduction7; /* 重写的注意事项: 1、子类在重写父类里方法是时,参数列表要求一模一样 2、子类方法覆盖父类方法,必须要保证权限大于等于父类权限 3、private 和 final 修饰的方法不能被覆盖, 因为私有只能本类访问,被final修饰的都是常量, 覆盖只发生在方法上,成员变量是不可能存在覆盖的。 4、static关键字,静态只能覆盖静态,或者被静态覆盖, 静态方法是不属于对象的,属于类。 */ public class CarsOverridingBMW extends CarsOverridingParent{ public static void main(String[] args) { } }
3、子类重写父类中的方法
package introduction7; import javax.crypto.Cipher; /* 重写的注意事项: 1、子类在重写父类里方法是时,参数列表要求一模一样 2、子类方法覆盖父类方法,必须要保证权限大于等于父类权限 3、private 和 final 修饰的方法不能被覆盖, 因为私有只能本类访问,被final修饰的都是常量, 覆盖只发生在方法上,成员变量是不可能存在覆盖的。 4、static关键字,静态只能覆盖静态,或者被静态覆盖, 静态方法是不属于对象的,属于类。 */ public class CarsOverridingBMW extends CarsOverridingParent{ //@表示为此方法添加注解,override表示此方法为重写方法 @Override public void engineStart(int cly) { System.out.println("这是子类。。。"); } public static void main(String[] args) { //实例化对象 CarsOverridingBMW c1 = new CarsOverridingBMW(); //调用类中的重写方法 c1.engineStart(2); } }
结果为:
4、在子类中重写父类方法的同时使用关键字super调用父类中的该方法
结果为:
三、重写方法的优势
在父类基础上进行功能的扩展,加入子类特有的功能,父类中已经定义的功能,子类可以直接拿来用,如果子类想对功能的内容有自己的定义的话,子类可以保留父类功能的声明(声明指方法名同父类方法名一致),然后建立子类特有的功能。
四、多态
父类类型的引用来指上子类
1、在父类中新建一个方法
2、子类中访问调用
package introduction7; import javax.crypto.Cipher; /* 重写的注意事项: 1、子类在重写父类里方法是时,参数列表要求一模一样 2、子类方法覆盖父类方法,必须要保证权限大于等于父类权限 3、private 和 final 修饰的方法不能被覆盖, 因为私有只能本类访问,被final修饰的都是常量, 覆盖只发生在方法上,成员变量是不可能存在覆盖的。 4、static关键字,静态只能覆盖静态,或者被静态覆盖, 静态方法是不属于对象的,属于类。 */ public class CarsOverridingBMW extends CarsOverridingParent{ //@表示为此方法添加注解,override表示此方法为重写方法 @Override public void engineStart(int cly) { // super.engineStart(2); System.out.println("这是子类。。。"); } public static void main(String[] args) { //实例化对象 // CarsOverridingBMW c1 = new CarsOverridingBMW(); //调用类中的重写方法 // c1.engineStart(2); //父类类型的引用指向父类,调用重写方法时调用的都是父类中的方法,无法调用子类 CarsOverridingParent c2 = new CarsOverridingParent(); //打印结果为“这是父类。。。” c2.engineStart(2); //打印结果为“这是父类里面increaseSpeed” c2.increaseSpeed(); //父类类型的引用指向子类,既可以调用父类中的方法,也可以调用子类中的方法 CarsOverridingParent c3 = new CarsOverridingBMW(); //打印结果为“这是子类。。。” c3.engineStart(2); //打印结果为“这是父类里面increaseSpeed” c3.increaseSpeed(); } }