一、重载(Overload)
注意:为了正确的区分重载和重写,请各位务必记清重载(Overload)和重写(Override)的英文。
(1)重载定义:表示两个或多个方法的名字相同,但方法的参数不同。方法参数不同有两层含义:A、参数的个数不同;B、参数的类型不同。
public void run(String name, int count)
{
System.out.println(count + " " + name + " " + "are running.");
}
public void run(int count, String name)
{
System.out.println(count + " " + name + " " + "are running.");
}
请思考以上两个方法是否构成了重载?
(2)重载发生的时机:重载是发生在同一个类内部的两个或多个方法之间。
(3)方法的返回类型对重载没有任何影响!即,对于方法名字和参数都相同的两个方法,如果他们的返回类型不同,这种语法格式是错误的,大家可以试一试。那么,也就是说,只要是重载返回类型一定相同。否则为两个不同的方法。如下代码,这是两个不同的方法。
public void run()
{
System.out.println("dog is running");
}
public int run(String name, int count)
{
System.out.println(count + " " + name + " " + "are running.");
return 1;
}
(3)构造方法之间的重载:一个类中有多个构造方法,那么它们一定是重载的。
(4)重载方法之间的调用:对于普通方法的重载,重载的方法之间是可以直接调用的,如下代码一。
但是对于重载的构造方法之间的调用,需要使用this()关键字。A、this()括号中参数表示目标构造方法所接收的参数;B、对this()的调用必须是构造方法的第一条语句。如下代码二。
public int run(String name, int count)
{
System.out.println(count + " " + name + " " + "are running.");
return 1;
}
public void run(int count, String name)
{
run(name , count);
System.out.println(count + " " + name + " " + "are running.");
}
public Dog()
{
this("金巴");
System.out.println("你好世界,我是一条狗!");
}
public Dog(String name)
{
System.out.println("你好世界," + "我是一条" + name + "狗!");
}
二、重写(Override)
(1)重写定义:子类与父类的方法的返回类型一样,方法名称一样,参数一样,这样我们就说子类与父类的方法构成了重写关系。
补充:在重写中,我们一直没提到权限的问题(public、protected、private),使用private修饰的方法是不能够进行重写的,也不能够被继承,所以private和多态扯不上关系。在同一个包下,构成重写关系,父类和子类的方法,权限可以是public和public、protected和protected、protected和public,但不可能是public和protected,即权限可以扩大但不可缩小。
(2)重写发生的时机:重写发生在父类与子类之间。
(3)构造方法时不能重写的,如果您理解是构造方法的作用,就知道构造方法为什么不能重写。
(4)在重写时,子类重写的方法调用父类被重写的方法时,可以使用super.父类方法的方式调用,其中此语句不必放在第一行。如下代码所示:
class Animal
{
public void run()
{
System.out.println("animal is running");
}
}
class Dog extends Animal
{
//override
public void run()
{
System.out.println("dog is running");
super.run();
}
}