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.参数类型及个数
都要与父类继承的方法相同,才叫方法的重写
例如:
运行结果: