重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改 变。
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据 需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类 的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的 子类异常。
方法的重写规则:
- 参数列表必须完全与被重写方法的相同;
- 返回类型必须完全与被重写方法的返回类型相同;
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方 法被声明为public,那么在子类中重写该方法就不能声明为protected。
- 父类的成员方法只能被它的子类重写。
- 声明为final的方法不能被重写。
- 声明为static的方法不能被重写,但是能够被再次声明。
- 子类和父类在同一个包中,那么子类可以重写父类所有除了声明为private和final 的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和 protected的非final方法。
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,
- 重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性 异常,反之则可以。
- 构造方法不能被重写。
- 如果不能继承一个方法,则不能重写这个方法。
实例代码如下
:public class Bird {
public Bird(){
System.out.println("Bird 构造器");
}
//先定义一个属性
int weight = 0;
//私有的变量,private不允许被继承
//private int intPrivate=
//方法(定义一个方法给其他的类进行继承)
public void fly(){
System.out.println("我是鸟,我可以飞!");
}
public void eatting(){
System.out.println("我能吃很多");
}
//私有的方法
// private void privateMethod(){
// System.out.println("privateMethod");
// }
// private 方法
private void methodPrivate(){
System.out.println("....test.....");
}
public static void print(){
System.out.println("print");
}
}
public class Ostrch extends Bird{//继承
public Ostrch(){
System.out.println("Ostrch 构造器");
}
//重写fly的方法
//如果在括号内加了int i.那么就不是重写了是重载、、、形参列表
public void fly(){
//super指向的是父类
//指向的是自己
super.fly();
System.out.println("虽然我是鸟,但是我不会飞");
}
public static void sss(){
int year =10;
int month =3;
System.out.println("1234");
}
public static void print(){
System.out.println("Ostrch print");
int year =10;
int month =3;
System.out.println("123"+year);
}
}