Java重写&重载*

 重写 (Override)

在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式称为方法重写(又称为方法覆盖)

当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写

子类可以根据需要,定义特定于自己的行为

 

重写规则

  • 参数列表与被重写方法的参数列表必须完全相同
  • 返回值类型与被重写方法的返回值类型可以不相同,但是必须小于或等于父类方法的返回值类型
  • 访问权限不能比父类中被重写方法的访问权限更低(访问控制修饰符:public>protected>default>private)

例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected

  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以

注意:

  • 重写的方法可以使用 @Override 注解来标识
  • 父类的成员方法只能被它的子类重写
  • 声明为 final 的方法不能被重写
  • 声明为 static 的方法不能被重写,但是能够再次声明
  • 构造方法不能被重写
  • 子类和父类在同一个包中时,子类可以重写父类的所有方法,除了声明为 private 和 final 的方法
  • 子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected 的非 final 方法
  • 如果不能继承一个方法,则不能重写这个方法

 

例:

每种动物都有名字和年龄属性,但是喜欢吃的食物是不同的,比如狗喜欢吃骨头、猫喜欢吃鱼等,因此每种动物的介绍方式是不一样的

在父类 Animal 中定义 getInfo() 方法,并在子类 Cat 中重写该方法, 实现猫的介绍方式

父类 Animal 的代码如下:

public class Animal {
    // 名字
    public  String name;
    // 年龄
    public int age;

    public Animal(String name,int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getInfo() {
        return "我叫" + name + ",今年" + age + "岁了";
    }
}

子类 Cat 的代码如下:

public class Cat extends Animal{
    // 爱好
    private String hobby;

    public Cat(String name, int age,String hobby) {
        super(name, age);
        this.hobby = hobby;
    }

    public String getInfo() {
        return "大家好!我叫" + this.name + ",今年" + age + "岁了,我爱吃" + hobby + "。";
    }

    public static void main(String[] args) {
        Animal animal = new Cat("喵喵",3,"鱼");
        System.out.println(animal.getInfo());
    }
}

上述代码中,在 Animal 类中定义了一个返回值类型为 String、名称为 getInfo() 的方法,而 Cat 类继承自该类,因此 Cat 类同样含有与 Animal 类中相同的 getInfo() 方法。但是我们在 Cat 类中又重新定义了一个 getInfo() 方法,即重写了父类中的 getInfo() 方法

 

 

super 关键字

当需要在子类中调用父类的被重写方法时,要使用 super 关键字

 

 

2.语法规则:

a.返回值类型

b.方法名

c.参数类型及个数

都要与父类继承的方法相同,才叫方法的重写

例如:

运行结果:

 

posted @ 2020-04-09 14:04  梦清欢  阅读(211)  评论(0编辑  收藏  举报