为什么要重写
我们先看一个例子——对于父类Father和子类Student:
public class Father {
public void eat(){
System.out.println("用筷子吃饭");
}
}
现在子类Student想描述去吃西餐的行为,这时父类“用筷子吃饭”的描述显然与事实不符,即——子类继承父类的eat方法已经不能 “准确描述子类自身的行为特征” 了,于是我们要采取重写,在子类中用新的方法覆盖父类之中的eat方法,以达成对于子类本身属性的正确表述。
public class Student extends Father {
@Override
public void eat(){
System.out.println("用刀叉吃饭");
}
}
什么是重写
重写,顾名思义,重新改写——将一个已有的事物进行改变以适应新的需求。
怎么重写
1.方法名相同,参数列表相同。
以上图为例,对于子类Student,若想覆盖重写eat方法,那么新创建的方法名必须也是eat。
参数列表相同则意味着数据类型和个数相同,即若父类的eat方法为无参的,子类重写之后依然,若有参,则子类重写的方法中所含参数的数据类型与个数应该与父类之中的方法一致。
2.重写之后的访问权限只能比父类的方法大或相同。
访问权限大小:public>protecte>friendly(没有对于开放范围的修饰词时一般默认friendly 如【void eat(){}】)>private
3.返回值:如果父类方法的返回值为void或者基本数据类型【byte,short,int,long,float,double,char,boolean】,则子类 的返回值必须与父类相同。
如果父类方法返回值为引用类型,则子类重写之后的方法返回值类型要么相同,要么是父类方法返回值的子类,不能是基本数据类型。
显然,由于子类的范围(默认是friendly)小于父类方法的范围protected,因此报错。
其他注意事项
1.如果父类之中方法被final修饰,则该方法无法被重写。
2.java为了标准一个方法是重写之后的方法,用@Override
3.如果不重写,而仅仅只是调用父类之中的方法
- 在子类的非静态方法或代码块之中,用super。
- 如果是静态方法或代码块,必须创建父类对象然后调用。