- 重载(Overloading):为了让方法名相同而形参不同的构造方法同时存在,让类以统一的方式处理不同类型数据的一种手段
- 重写(Overriding):导出类对继承自基类的方法做出一定的修改,又称方法覆盖。
区别:
- 应用范围:Overloading用于同一个类的内部;Overriding用于存在继承关系的基类和导出类之间
- 鉴别点:Overloading 每个重载方法都有独一无二的参数类型类别(或参数类型不同,或参数个数不同,或参数顺序不同(顺序不同代码难以维护,不建议使用))
Overriding:导出类的方法和基类的方法具有相同的方法名、返回类型和参数列表,重写方法覆盖基类的方法
案例分析:
- Overloading:
在Tree这个类中,有两种构造器:一个默认构造器Tree()(不含参数),一个含参数的构造器Tree(int initialHeight),(关于构造器的问题下一节在具体阐述);
有两个方法:一个不含参的方法void info(),一个对此方法进行重载的含参方法void info(String s);
在main函数中,Tree类初始化了一个对象t,传递参数值i,所以调用含参的构造器Tree(int initialHeight),将i的值赋值给height,输出Creating new Tree that is 0 feet tall,接着调用t.info()方法,输出Tree is 0feet tall,然后调用含参重载方法t,info("overloaded method"),输出overloaded method:Tree is 0 feet tall,然后for循环5次,最后调用tree的默认构造器Tree();
- Overriding
可以看出,在基类中有三个方法void paly(),String what(),void adjust(),三个导出类Wind,Percussion,Stringed中分别对三个方法进行了重写;Wind的两个子类Woodwind,Brass对其中两个方法void play(),String what()进行了重写,在mian函数中置入orchestra数组,将五个类自动向上转型为Instrument类(向上转型、向下转型的概念将会在以后的博客中涉及到),tuneAll(orcheatra)调用tuneAll方法,将数组中的元素传入方法,然后foreach循环遍历数组中的元素for(Instrument i:e),调用tune方法,tune(i),将遍历后得到的数组元素的字符串信息i 传递到tune方法,然后i.play分别调用各自类中的重写方法play进行输出
(案例分析均来自于《java编程思想 第四版》)