重写
重写(Overwriting)是子类对父类的函数进行重新定义。
- 方法名、返回值类型、参数列表必须保持一致(java7 及更高版本:返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类)
- 访问权限:重写的方法访问权限必须大于等于父类方法。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。也就是子类中的方法不能做更严格的限制。
- 异常:重写的方法抛出的检查异常不能大于父类方法,可以抛出任何非检查异常
- 声明为final 跟 static的方法不能被重写
- 构造方法不能被重写
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
子类中调用父类被重写方法时,可以使用super关键字。
public class OverRiddingTest { public static void main(String[] args) { Animal a = new Animal(); Human h = new Human(); a.move(); h.move(); h.play(); Animal ah = new Human(); //ah.play();父类申明变量指向子类实例,该父类变量不能调用父类不存在的变量和方法,否则会编译错误 } } class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Human extends Animal{ public void move(){ super.move(); System.out.println("人是动物,可以双脚直立行走"); } public void play(){ System.out.println("人会种花"); } }
重载
重载(Overloading)是让类以统一的方式处理不同类型数据的一种手段。
- 在一个类里面,方法名字相同,而参数(类型、个数)不同
- 返回类型可以相同也可以不同
- 可以有不同的访问修饰符
- 可以抛出不同的异常
- 多态性:调用时,通过传递的参数的个数、类型来决定使用哪个方法
public class OverLoadingTest { public static void main(String[] args) { Dog g = new Dog(); g.bark("hahahahah"); g.bark(3); } } class Dog{ public void bark(){ System.out.println("狗吠"); } public void bark(int i){ System.out.println("狗吠了"+i+"声"); } public void bark(String s){ System.out.println(s); } }
构造方法不能被重写,可以被重载。