成员变量的隐藏和方法重写(覆盖)


  在类的层次结构中,当子类发现继承自父类的成员变量或方法不满足自己的要求时,就会对其重新定义。当子类的成员变量与父类的成员变量同名时(声明的类型可以不同),子类的成员变量会隐藏父类的成员变量;当子类的方法与父类的方法具有相同的名字、参数列表、返回值类型时,子类的方法就叫做重新(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 类型的方法是不能被重写的。

原文地址:https://www.cnblogs.com/xiaonanman/p/6719206.html