重写(Override)与重载(Overload)
构造器(constructor)是否可被重写 ?
构造器不能被继承,因此不能被重写,但可以被重载。
重写(Override)
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();// 执行 Dog 类的方法
}
}
编译运行结果如下:
动物可以移动
狗可以跑和走
重载(Overload)
public static void main(String[] args){
Overloading o = new Overloading();
System.out.println(o.test());
System.out.println(o.test(1));
System.out.println(o.test(1,"test3"));
System.out.println(o.test("test4",1));
}
class Overloading{
/**
* 一个类中定义的方法,是允许重载 (相同的方法名称)
*
* 1、方法名称相同
* 2、参数列表长度 | 参数列表类型 | (参数类型顺序不同)
*
* 注意: 与返回值类型无关
*/
public int test(){
System.out.println("test1");
return 1;
}
public void test(int a){
System.out.println("test2");
}
//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return "test3";
}
public String test(String s,int a){
System.out.println("test4");
return "test4";
}
}
重载和重写的区别
方法的重载和重写都是实现多态的方式,区别在于:
重载实现的是编译时的多态性,重写实现的是运行时的多态性。
-
重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
-
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。
方法的重写规则
- 方法名和参数名必须相同。
- 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类。
- 访问权限不能比父类中被重写的方法的访问权限更低。
- 父类的成员方法只能被它的子类重写。
- 声明为 final 的方法不能被重写。
- 声明为 static 的方法不能被重写,但是能够被再次声明。
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
- 构造方法不能被重写。
- 如果不能继承一个方法,则不能重写这个方法。