继承与成员方法的关系--方法的重写

方法重写的概述

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

方法重写的定义

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

面试题

Java中重写与重载的区别:

1、重写是发生在继承的关系中,子类的方法名、参数列表、返回值都和父类一样

2、重载是发生在同一个类中,方法名一样,参数列表不一样,与返回值无关

生活中方法重写的举例:

BB机--大哥大--小灵通--智能手机

水杯--保温杯--破壁杯

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

class NewPhone extends OldPhone{
    public void call(String name){
     // System.out.println("给"+name+"打电话");
        super.call(name);//调用父类的call方法
        System.out.println("学习");
    }
}

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

子类中playFootball方法与父类中playFootball方法的方法名相同、参数列表、返回值都相同,即为方法的重写

class Father3{
    public void playFootball(){
        System.out.println("踢足球");
    }
    private void fly(){
        System.out.println("飞翔");
    }
}

class Son3 extends Father3{

    public void playFootball(){
        System.out.println("功夫足球");
    }

    public void fly(){
        System.out.println("飞");
    }
}


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

方法重写在IDEA里的智能键入:

class Father3{
    public void playFootball(){
        System.out.println("踢足球");
    }
  //private关键字修饰的的方法,不可以在子类中被重写
    private void fly(){
        System.out.println("飞翔");
    }
}

class Son3 extends Father3{
  //@Override 今后看到这个符号,就代表重写了父类中的方法
    @Override
    public void playFootball() {
        super.playFootball();
    }

    public void fly(){
        System.out.println("飞");
    }
}




public class ExtendsDemo5 {
    public static void main(String[] args) {
        Son3 son3 = new Son3();
        son3.playFootball();
        son3.fly();
    }
}

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

1、子类中的私有成员方法无法被子类重写,案例如上述父类的fly方法

2、子类重写父类的方法的时候,访问权限不能比父类的访问权限要低
要么和父类定义方法的权限一致,要么就比它的访问权限高(子类成员方法的访问权限不低于父类成员方法访问权限)
建议重写的时候,子类与父类中方法定义的格式一致

class Father3{
    public void playFootball(){
        System.out.println("踢足球");
    }
   //去掉访问权限修饰符也可以使用
     public void fly(){
        System.out.println("飞翔");
    }
}

class Son3 extends Father3{

    @Override
    public void playFootball() {
        super.playFootball();
    }
  //public访问权限高于无访问修饰符访问权限
    @Override
    public void fly() {
        super.fly();
    }
}


public class ExtendsDemo5 {
    public static void main(String[] args) {
        Son3 son3 = new Son3();
        son3.playFootball();
        son3.fly();
    }
}

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

class Father3{
    public void playFootball(){
        System.out.println("踢足球");
    }
    //父类的静态成员方法无法被子类重写
     public static void fly(){
        System.out.println("飞翔");
    }
}

面试题:

1、方法重写与方法重载的区别?方法重载能改变返回值类型吗?

Override(重写)

Overload(重载):与返回值类型无关

2、this关键字与super关键字分别代表什么?以及他们各自的使用场景和作用