Java中的重写和重载
方法的重载和重写
方法的重载(Overload):
1、 Java允许同一个类里定义多个同名方法,只要形参列表不同就可以。如果同一个类中包含了两个或多个方法的方法名相同,但形参列表不同,则被称为方法重载。
2、 方法重载的要求就是两同、一不同:同一个类中方法名相同,参数列表不同。至于方法的其他部分,如方法的返回值类型、修饰符等,与方法重载没有任何关系。
3、 下面是包含了方法重载的示例(代码):
在同一个类中重载:
public class OverLoadDemo {
//下面定义了两个test()方法,但方法的形参列表不同。系统是可以区分这两个方法的,这种被称为方法重载
public void test(){
System.out.println(“这是无参数的test方法”);
}
public void test(String msg){
System.out.println(“这是带参数的test方法:”+msg);
}
public static void main(String[] args) {
OverLoadDemo old = new OverLoadDemo();
//调用test时没有传入参数,因此系统调用上面没有参数的test方法
old.test();
//调用test传入参数时,则系统会调用上面有一个字符串参数的test方法
old.test(“Overload测试”);
}
}
在子类中重载:
class testDmeo{
public void test(){
System.out.println(“这是无参数的test方法”);
}
}
public class OverLoadDemo extends testDmeo{
//下面定义了两个test()方法,但方法的形参列表不同。系统是可以区分这两个方法的,这种被称为方法重载
public void test(String msg){
System.out.println(“这是带参数的test方法:”+msg);
}
public static void main(String[] args) {
OverLoadDemo old = new OverLoadDemo();
//调用test时没有传入参数,因此系统调用上面没有参数的test方法
old.test();
//调用test传入参数时,则系统会调用上面有一个字符串参数的test方法
old.test(“Overload测试”);
}
}
打印结果是:
这是无参数的test方法
这是带参数的test方法:Overload测试
方法的重写(Override):
1、 大部分的时候,子类总是以父类为基础,额外添加新的属性和方法。但有一种情况例外:子类需要重写父类的方法。例如鸟类都包含了飞翔的方法,其中鸵鸟是一种特殊的鸟类,因此鸵鸟也是鸟的子类,因此它也将从鸟类获得飞翔方法,但这个飞翔方法明显不适合鸵鸟,为此,鸵鸟需要重写鸟类的方法。
2、 如下代码可以帮助理解重写:
class Bird{
//Bird类的fly()方法
private void fly(){
System.out.println(“我要在天空中飞翔”);
}
}
public class OcerrideTest extends Bird{
//重写Bird类的fly()方法 public void fly(){
System.out.println(“我只能在地上奔跑”);
}
public static void main(String[] args) {
//创建OcerrideTest对象
OcerrideTest ot = new OcerrideTest();
ot.fly();
}
}
打印结果为:我只能在地上奔跑
这种子类包含父类同名方法的现象被称为方法重写,也被称为方法覆盖(Override)。
方法的重写要遵循“两同两小一大”规则:
⑴ “两同”:方法名相同;形参列表相同。
⑵ “两小”:子类方法之返回类型应比父类方法返回值类型更小或相等;子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等。
⑶ 子类方法的访问权限应比父类方法更大或相等
尤其需要指出的是:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法,例如下面的代码将会有编译错误:
Class BaseClass{
public static void test(){…….}
}
Class SubClass extends BaseClass{
public void test(){………….}
}
若想调用父类中的fly()方法,则只需在子类中fly()方法中加上如下代码即可:
super.fly();
注意:super和this一样,都不能出现在static的方法中
特别说明:
其实把重载和重写放在一起比较本身没有太大的意义,因为重载主要发生在同一个类的多个同名方法之间,而重写发生在子类和父类的同名方法之间。它们之间的联系很少,除了二者都是发生在方法之间,并要求方法名相同之外,没有太大的相似之处。当然,父类方法和子类方法之间也可能发生重载,示例上面有哦。