在类的层次结构中,当子类发现继承自父类的成员变量或方法不满足自己的要求时,就会对其重新定义。当子类的成员变量与父类的成员变量同名时(声明的类型可以不同),子类的成员变量会隐藏父类的成员变量;当子类的方法与父类的方法具有相同的名字、参数列表、返回值类型时,子类的方法就叫做重新(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+" "+"salary:"+salary+" "); } }
示例:经历高工资,超过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+" Department:"+department+" Salary:"+ salary+" "); } } //测试类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 类型的方法是不能被重写的。