方法的重载与覆盖
1.方法的重载(编译时多态)
在一个类中,我们可以定义一系列方法,这些方法的方法名称相同,参数列表不同,这种语法称之为方法的【重载】。例如我们可以为Student类定义两个study方法;
Class Student {
public ststic void study(){
System.out.println("study()");
}
public static void study(int n){
System.out.println("study(int)");
}
}
上面这段代码中,在Student类中定义了两个study方法,一个没有参数,另一个带一个字符串参数。在程序运行期间,根据不同的参数,会调用不同的方法。例如:
public class TestStudent{
public static void main(String[] args){
Student stu = new Student();
stu.study(); // 调用无参的study方法,打印study()
stu.study(10);// 调用有参数的study方法,打印study(int)
}
}
【需要注意的是,当程序被编译时,如果出现方法的重载,Java编译器会根据不同的实参类型,来匹配一个合适的方法调用】
因此,方法的重载又被称为“编译时多态”。
【请记住,这里格外强调“编译时”的概念,因为,哪一个重载的方法会被调用,这个问题在程序的编译时就已经决定了】
我们强调了,方法的重载的关键在于“方法名相同,参数表不同”。那究竟什么样式儿的参数表算是“不同”呢?以下几种情况都可以认为是参数表不同:
1>参数个数不同,例如:void study()和void study(int a)
2>参数类型不同,例如:void study(int a)和void study(double d)
3>参数类型的顺序不同,例如:void study(int a, double d)和void study(double d, int a)
【特别提示:如果两个方法仅仅是形参的名称不同,这不算重载!】即,下面两个方法不能算构成重载:
void study(int a)和void study(int b)
此外,方法的重载对方法声明的其他部分没有要求。也就是说,对返回值类型,修饰符,抛出的异常这三个部分,方法重载并不要求它们相同或是不相同。
为什么要设计重载的语法呢?如果一个类中有多个方法,为什么不让这些方法以方法名作为区分呢?
举例而言,“System.out”是一个对象,在这个对象中,有多个重载的println方法。例如,我们之前写过这样的代码:
int i = 10;
System.out.println(i);
System.out.println("Hello World");
System.out.println();
在上面的代码中,我们调用了三次println方法。【注意:这三次调用println方法的时候,都分别传入了不同的参数;第一次参数为Int类型,第二次参数为字符串类型,第三次参数为空】
现在我们知道,实际上我们调用了三个不同的println方法【重载】。这三个方法都是“System.out”的对象的方法。在这个对象中还有多个重载的println方法。
这样对于程序员来说,要打印某一个东西,不管是什么类型的参数都可以交给System.out,println方法打印,而不用考虑具体的参数类型。这就像是套用数学公式,只要把数据带入就可以了。程序员只需要记住“System.out.println”能够打印数据就可以。程序员不用担心这里面究竟定义了几个println方法,又该调用哪一个方法。
----------------------------------------------------华丽丽的分割线----------------------------------------------------
2.方法的覆盖(继承时多态)