子类通过重写可以隐藏已继承的方法(方法重写称为方法覆盖(method overriding))
1、重写的语法规则:
如果子类可以继承父类的某个方法,那么子类就有权利重写这个方法。所谓方法重写,是指子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。
2、重写的目的:
子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。
重写的方法即可以操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其它方法,但无法操作被子类隐藏的成员变量和方法。如果子类想使用被隐藏的方法或成员变量,必须使用关键字super。
举例:
package 方法重写;
public class University {
void enterRule(double math,double english,double chinese) {
double total=math+english+chinese;
if(total>=180) {
System.out.println(total+"分数线达到大学录取线");
}
else {
System.out.println(total+"分数线未达到大学录取线");
}
}
}
package 方法重写;
public class ImportantUniversity extends University{
void enterRule(double math,double english,double chinese) {
double total=math+english+chinese;
if(total>=220) {
System.out.println(total+"分数线达到重点大学录取线");
}
else {
System.out.println(total+"分数线未达到重点大学录取线");
}
}
}
package 方法重写;
public class E5_4 {
public static void main(String[] args) {
double math=62;
double english=76.5;
double chinese=67;
ImportantUniversity univer=new ImportantUniversity();
univer.enterRule(math, english, chinese);//调用重写的方法
math=91;
english=82;
chinese=86;
univer.enterRule(math, english, chinese);//调用重写的方法
}
}
注意:重写方法的类型可以是父类方法类型的子类型,即不必完全一致:
package 方法重写;
class A{
Object get() {
return null;//返回一个空对象
}
}
class B extends A{
Integer get() {//Integer get是Object的子类
return new Integer(100);//返回一个Integer对象
}
}
public class E5_6 {
public static void main(String[] args) {
B b=new B();
Integer t=b.get();
System.out.println(t.intValue());
}
}
3、重写的注意事项:
重写父类的方法时,不允许降低方法的访问权限,但可以提高访问权限(访问限制修饰符按访问权限从高到低的排序是public\protected\友好的\private):
举例:
package 方法重写;
class A{
protected float f(float x,float y) {
return x-y;
}
}
class B extends A{
float f(float x,float y) {//非法,因为降低了访问权限
return x+y;
}
}
class C extends A{
public float f(float x,float y) {//合法,因为提高了访问权限
return x*y;
}
}
public class 注意事项 {
public static void main(String args[]) {
}
}