面向对象--继承--方法的重写

方法重写概述 

当子类中的方法与父类中的方法一样的时候,内部实现不一样
这种现象我们称之为方法的重写,方法的覆盖

重写的定义:

子类中的方法名与形参列表以及返回值类型都和父类一样(方法声明一样),只是内部实现不一样。

方法重写的应用:

当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。 

面试题:

java中重写与重载的区别:

  • Override :重写是发生在继承的关系中,方法名,参数列表,返回值类型都和父类一样   
  • Overload :重载是发生在同一个类中,方法名字一样,参数列表不一样,与返回值无关

程序示例

/*
        当子类中的方法与父类中的方法一样的时候,内部实现不一样
        这种现象我们称之为方法的重写,方法的覆盖

        重写的定义:
            子类中的方法名与形参列表以及返回值类型都和父类一样(方法声明一样),只是内部实现不一样。

        面试题:
            java中重写与重载的区别:
                1、重写是发生在继承的关系中,方法名,参数列表,返回值类型都和父类一样
                2、重载是发生在同一个类中,方法名字一样,参数列表不一样,与返回值无关
*/

class OldPhone{
    public void call(String name){
        System.out.println("给"+name+"打电话");
    }
}

class NewPhone extends OldPhone{
  //方法重写:方法声明一样
    public void call(String name){
      //内部实现不同
        System.out.println("给"+name+"打电话");
        System.out.println("学习");
    }
}

public class ExtendsDemo4 {
    public static void main(String[] args) {
        NewPhone newPhone = new NewPhone();
        newPhone.call("小伟");
    }
}

方法重写的注意事项(存在于继承的关系中)

  • 父类中的私有成员方法无法被子类重写
  • 子类重写父类的方法的时候,访问权限不能比父类的访问权限要低

要么和父类定义方法的权限一致,要么就比它的访问权限高
建议重写的时候,子类与父类中方法定义的格式一致

  • 父类中静态的成员方法,无法被子类重写,静态的成员是属于类本身的东西

程序示例

/*
        方法重写的注意事项(存在于继承的关系中)
            1、父类中的私有成员方法无法被子类重写
            2、子类重写父类的方法的时候,访问权限不能比父类的访问权限要低
                要么和父类定义方法的权限一致,要么就比它的访问权限高
                建议重写的时候,子类与父类中方法定义的格式一致
            3、父类中静态的成员方法,无法被子类重写,静态的成员是属于类本身的东西
*/

class Father3{
  
    public void PlayFootball(){
        System.out.println("踢足球");
    }
  
//   父类的私有成员方法fly()  
    private void fly(){
        System.out.println("飞翔");
    }
    
  
//---------------------------------------
/*
   假如我把父类中的fly()改成public修饰的
    public void fly(){
        System.out.println("飞翔"); 
    }
*/
  
      
    //父类的静态成员方法fly1()
    public static void fly1(){
        System.out.println("飞翔");
    }
}

class Son3 extends Father3{
  
//   方法的重写
//@Override 今后看到这个符号,就代表重写了父类中的方法
  
   @Override
    public void PlayFootball() {
    System.out.println("功夫足球");
    }
  
//子类中也有一个fly()的方法,但这不是方法的重写,这是子类自己定义的成员方法
//哪怕你把public改成private也不是对父类中fly()方法的重写
//因为父类中的私有成员方法无法被子类重写
    public void fly(){
        System.out.println("飞");
    }  
  
  
//--------------------------------------- 
/*
而且我把子类中的fly()改成private修饰的
这个时候又会报错,因为子类重写父类的方法的时候,访问权限不能比父类的访问权限要低
    private void fly(){
        System.out.println("飞");
    }
*/
  
  
  //哪怕子类中fly1()方法写的和父类中的一样,但这也不是方法的重写
  //因为被static关键字修饰的成员属于类的本身,不可被子类重写
  //这是子类的静态成员方法fly1()
    public static void fly1(){
        System.out.println("飞翔");
    }
}

public class ExtendsDemo5 {
    public static void main(String[] args) {
        Son3 son3 = new Son3();
        son3.PlayFootball();//输出:功夫足球
        son3.fly();//输出:飞
    }
}

 

posted @ 2021-12-10 19:56  赤兔胭脂小吕布  阅读(92)  评论(0)    收藏  举报