重载 与 重写
重载 Overload 同一个方法名,参数不同
- 其中参数不同指的是参数的类型,数量,类型的顺序这三种至少有一种不同。
- 方法重载与 返回值类型 无关,与 访问修饰符 无关
- 若只有返回值不同,编译的时候会报错。即使不报错,运行时无法区分调用哪个方法
- 构造方法也可以重载
- 重写 Override 又称方法覆盖 父类与子类有同样的方法名和参数。
package polymorphism; /** * 想法来自 知乎用户:程序狗 *https://www.zhihu.com/question/30082151 * * 将其提到的木兰从军这个形象例子自己编程实现 * @author Jacquie * */ public class OverrideTest { public static void main(String[] args) { HuaHu hua = new HuaMuLan(); //向上转型 System.out.println("花木兰替父从军------------"); //hua.shuZhuang(); //报错:The method shuZhuang() is undefined for the type HuaHu System.out.println("自我介绍:"+hua.ziWoJieShao()+hua.sex+"。 战场上:"+hua.qiMaShaDi()); HuaMuLan mulan = (HuaMuLan)hua; //向下转型 System.out.println("木兰恢复女儿身------------"); mulan.shuZhuang(); System.out.println("自我介绍:"+mulan.ziWoJieShao()+mulan.sex+"。 战场上:"+mulan.qiMaShaDi()); /** * 运行结果: 花木兰替父从军------------ 自我介绍:我叫花弧,男。 战场上:花木兰在骑马杀敌 木兰恢复女儿身------------ 梳妆打扮 自我介绍:我叫花木兰,女。 战场上:花木兰在骑马杀敌 */ } } class HuaHu{ char sex = '男'; public String qiMaShaDi(){ return "花弧在骑马杀敌"; } public static String ziWoJieShao(){ return "我叫花弧,"; } } class HuaMuLan extends HuaHu{ char sex = '女'; @Override public String qiMaShaDi(){ return "花木兰在骑马杀敌"; } public static String ziWoJieShao(){ return "我叫花木兰,"; } public void shuZhuang(){ System.out.println("梳妆打扮"); } }
- 在方法之前加上@Override
- 只有非静态的成员方法才 称得上是重写能加@Override
- private、static、final修饰的方法重写也不起作用
- 成员变量重写不起作用
- 不能使用子类特有的成员属性和子类特有的成员方法。(弊端,需向下转型)
- 在继承关系的子类中重写父类的方法
- 重写的方法必须方法名相同,参数列表也相同
- 返回值类型应该与父类中被重写方法的返回值类型相同或是他的子类类型
- 访问权限应该与父类中被重写方法的访问权限相同或高于它的访问权限
- 重写的方法不能抛出比父类更加宽泛的异常