在类的层次结构中,当子类发现继承自父类的成员变量或方法不满足自己的要求时,就会对其重新定义。当子类的成员变量与父类的成员变量同名时(声明的类型可以不同),子类的成员变量会隐藏父类的成员变量;当子类的方法与父类的方法具有相同的名字、参数列表、返回值类型时,子类的方法就叫做重新(override)父类的方法(也叫做方法的覆盖)。方法的重写是动态多态性的表现。
当隐藏的成员变量或重写的方法在子类对象中调用时,它总是参考子类中定义的版本,弗雷中相应的定义就被隐藏。如果想使用父类中被隐藏的成员变量或被重写的成员方法就要使用super关键字。
示例:
public class Employee{
String name;
int salary; //父类中定义salary成员变量
public Employee(){ //无参构造方法
}
public Employee(String name,int salary){ //含有两个参数的构造方法
this.name = name;
this.salary = salary;
}
public void printInfo(){ //输出员工的相关信息
System.out.println("Name:"+name+"\n"+"salary:"+salary+"\n");
}
}
示例:经历高工资,超过3500,交税,用double类型,在Manager.java 中对salary 进行重新定义,并对父类的printInfo() 方法进行重写。
//Manager.java
public class Manager extends Employee{
double salary; //子类中定义salary成员变量,隐藏了父类的salary成员变量
String department;
public Manager(){ //无参构造方法
}
//含有3个参数的构造方法
public Manager(String name,double salary,String department){
this.name = name; //使用从父类继承的name属性
this.salary = salary;
this.department = department;
}
//对父类的printInfo()进行重写、输出管理者的信息
public void printInfo(){
System.out.pringln("Name:"+name+"\nDepartment:"+department+"\nSalary:"+
salary+"\n");
}
}
//测试类Test.java
public class Test{
public static void main(String[] args){
Employee e = new Employee("张三",1900);
e.printInfo();
System.out.println("e.salary="+e.salary);
Manager m = new Manager("李四",4545.4,"XXXX");
m.printInfo();
System.out.println("m.salary="+m.salary);
Manager s = new Manager("王五",4545.5,"XXXX");
s.printInfo();
}
}
下面给出方法重写的规则:
1.方法的重写一定要有继承关系。
2.方法的重写要求子类与父类的方法名相同、参数列表相同、返回值类型相同,不能抛出比父类更多的异常。
3.重写父类的方法时不能降低父类方法的可见性。
4.父类中的私有方法,不能被子类继承,就是说即使子类中将其覆盖了也不会有多态。
5.static 类型的方法是不能被重写的。