一、重写

 子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写,方法重写又称方法覆盖。

 

二、案例演示

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();
    }

}

 

版权声明:本文为luohuasheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/luohuasheng/p/9567218.html