多态(多种状态):
- 多态是继封装、继承之后,面向对象的第三大特性。
- 理解:就像一个人会打乒乓球、会做饭,做饭与打乒乓球就是这个人的两种状态
- 前提:必须有子父类的关系(继承、重写)
- 体现:父类引用指向子类对象(向上转型)
注意:子类对象调用重写的方法时,调用的是子类对象中的方法
举例
验证父类和子类对象对于重写方法的调用
在Employee(父)类中定义 mailCheck方法,让类Salary继承Employee类并重写mailCheck方法
- Employee类
public class Employee {
private String name;
private String address;
private int number;
//空参构造
public Employee(){}
//有参构造
public Employee(String name,String address,int number) {
System.out.println("Employee构造函数");
this.name = name;
this.address = address;
this.number = number;
}
//Employee类中的方法(邮递支票)
public void mailCheck() {
System.out.println("邮支票给"+this.name+" "+this.address);
}
//getter and setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
- Salary类
//Salary类继承Employee类
public class Salary extends Employee{
private double salary; //全年工资
//构造器
public Salary(String name, String address, int number, double salary) {
super(name, address, number);
this.salary = salary;
}
//重写Employee类的mailCheck方法
@Override
public void mailCheck() {
System.out.println("Salary类的mailCheck方法");
System.out.println("邮寄支票给:" + getName() + " ,工资为:" + salary);
}
public double getSalary() {
return salary;
}
public void setSalary(double newsalary) {
if(newsalary>=0.0) {
salary = newsalary;
}
}
public double computePay() {
System.out.println("计算工资,付给:"+getName());
return salary/52;
}
}
public class VirtualDemo {
public static void main(String[] args) {
Salary salary = new Salary("员工A","北京",3,3600.00);
Employee employee = new Salary("员工B","上海",2,2400.00); //向上转型
System.out.println("使用salary类的mailCheck方法");
salary.mailCheck(); //子类对象调用子类的方法
System.out.println("使用Employee类的mailCheck方法");
employee.mailCheck(); //父类对象调用父类的方法
}
}
结果打印
Employee构造函数
Employee构造函数
使用salary类的mailCheck方法
Salary类的mailCheck方法
邮寄支票给:员工A ,工资为:3600.0
使用Employee类的mailCheck方法
Salary类的mailCheck方法
邮寄支票给:员工B ,工资为:2400.0
结果显示,当子类对象调用重写方法时,调用的是子类的方法。想要在子类中调用父类中被重写的方法时,要使用关键字super(在子类外不可调用)