要了解“Java重写”,首先要知道“继承”,继承是一种基于已有类(父类)创建新类(子类)的一种方式
下面的Son类继承了Father类
public class Father(){
public void eat(String name,int age){
System.out.println("正在用筷子吃饭...");
}
public final void work{
}
}
public class Son extends Father(){
@Override //注解
public void eat(String str,int num){
System.out.println("正在用刀叉吃饭...");
}
}
-其中Object是所有类的父类,上面的Father类就默认继承了Object类(`public class Father extends Object(){}`)。
重写即为重新改写父类的方法,为了更准确的描述子类的行为特征
重写注意事项:
0、重写后的方法可以使用@Override修饰,表示该方法被重写。
1、重写后的方法访问权限要么和父类方法访问权限相同,要么大于父类方法(public > protected > 默认 > private)。例如上面的Father类用的是public,则Son类只能用public;但如果Father类用的是protected,则Son类可以使用protected,也可以使用public 。
2、父类中用final修饰的方法(注意:若用final修饰一个类,则该类没有子类,即不能被继承),子类不允许重写,但可以被继承。例如上面代码Father类中的work方法就不能被Son类重写,但可以被Son类继承。
3、父类中用static修饰的方法,子类也是不允许被重写,但可以被继承。例如上面Father类中的eat方法若改成:public static void eat(){}
,则只能被Son类继承,不能被其重写。
4、子类重写后的方法不能添加static修饰。
5、子类重写后的方法,方法名必须和父类方法名相同,参数列表除了名字不做限制外,其它必须相同,例如:上面Father类中(String name,int age)
和Son类中的(String str,int num)
,除了变量名字可以变动外,变量类型和数量都需保持一致。
6、返回值:
- a、如果父类返回值为void或基本数据类型,则重写后的方法返回值必须和父类方法返回值保持一致。例如上面Father类用的是void
public void eat(){}
,则Son类也只能用voidpublic void eat(){}
;如果Father类用的是intpublic int eat(){}
,则Son类也只能用intpublic int eat(){}
。 - b、如果父类方法返回值为引用类型,则重写后的方法返回值要么与父类一致,要么是父类方法返回值的子类。例如:Father类返回值为Object
public Object eat(){}
,则Son类返回值可以用String、int、long、double等,例如:
public Object eat(){
System.out.println("正在用筷子吃饭...");
return 1;
}
public String eat(){
System.out.println("正在用刀叉吃饭...");
return "";
}