一、概述
在上一篇文章中,介绍了类和对象的概念。也了解到在类中存在属性(成员变量)
和方法(成员方法)
。那么在这篇文中,就详细的介绍下成员方法中的方法重载
和方法重写
。
二、方法重载(OverLoad)
方法重载是OOP中的一个重要概念,而实际开发中经常用的方法重载。
2.1 方法重载的定义
在同一个类中:同名不同参,与返回值无关。
例如:
public class Student{
public void play(){
}
public int play(int time){
return 0;
}
}
2.2 方法重载的调用
方法重载根据参数匹配原则进行调用
例如:
public void play(){
System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",this.name,this.score,this.no);
}
public int play(int time){
return 0;
}
s1.play(1);//调用的是第5行的
s2.play();//调用的是第1行的
2.3 方法重载的使用
方法重载被大量运用在构造函数的重载上
例如:
class Student {
String name;
int score;
String no;
//第1种构造方法的重载
Student(String name1,int score1){
name= name1;
score= score1;
}
//第2种构造方法的重载
Student(String name1, int score1, String no1) {
name = name1;
score = score1;
no = no1;
}
}
public class StudentTest {
public static void main(String[] args) {
Student s1 =new Student("haha",76);//调用第1种构造方法的重载
Student s2 =new Student("yaya",67,"111");//调用第2种构造方法的重载
}
}
注:构造函数的简介见链接:构造函数
三、方法重写(OverRide)
3.1 什么是方法重写
在子类中将父类的方法再重新定义一遍。
3.1.1 未重写例子:
class Pet {//宠物
public void sound(){
System.out.println("宠物叫");
}
}
class Dog extends Pet {//狗
}
class Cat extends Pet{//猫
}
public class PetShop{//宠物店
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound();
Cat cat = new Cat();
cat.sound();
}
}
3.2 为什么要方法重写
- 如果子类从父类继承的方法不能满足子类的需要,或者不适合子类的需要。
- 此时子类可以将从父类继承的方法重写定义成满足自己需要的方法。
重新定义称为重写。
3.2.1 改进上面的例子,让猫和狗重写父类的sound()方法,实现各自的叫声:
class Pet {//宠物
public void sound(){
System.out.println("宠物叫");
}
}
class Dog extends Pet {//狗
//方法重写
@Override
public void sound() {
System.out.println("汪汪汪");
}
}
class Cat extends Pet{//猫
//方法重写
@Override
public void sound(){
System.out.println("喵喵喵");
}
}
public class PetShop{//宠物店
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound();//调用狗的sound()
Cat cat = new Cat();
cat.sound();//调用猫的sound()
}
}
3.3 方法重写的注意事项
- 方法重写时,方法的返回值类型 方法名 参数列表都要与父类一样。(同名,同参,同返回)
- 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
class Fu{
void show(){}
public void method(){}
}
class Zi extends Fu{
public void show(){} //扩大show的访问权限,编译运行没问题
void method(){} //缩小method的访问权限,编译错误
}
- 方法重写时,子类不能缩小父类抛出的异常,例如
class Pet {//宠物
public void sound() throws RuntimeException{
System.out.println("宠物叫");
}
}
class Cat extends Pet{//猫
//方法重写
public void sound() throws Exception{//错误,因为Exception 小于 RuntimeException
System.out.println("喵喵喵");
}
}
四、 方法重载(overload)和方法重写(override)的区别
- 方法重载:
- 在同一个类中(包括从父类继承的) 方法 同名 不同参 与返回值无关
- 方法重写:
- 方法重写存在于继承关系中
- 父子类之间的方法 同名,同参,同返回