一、多态的应用
- 多态数组:数组的定义类型为父类类型,里面保存的实际元素类型为子类类型。
应用实例:
现在有一个继承结构如下:
要求创建一个Person对象,2个Student对象和2个Teacher对象,
统一放在数组中,并调用每个对象的say方法。
代码演示:
public class poly_arr01 {
public static void main(String[] args) {
Person[] persons=new Person[5];
persons[0]=new Person("jack",20);
persons[1]=new Student("jack",18,100);
persons[2]=new Student("smith",19,80);
persons[3]=new Teacher("scott",30,20000);
persons[4]=new Teacher("king",50,30000);
// 遍历多态数组
for (int i=0;i<persons.length;i++){
// persons[i]的编译类型是Person,运行类型则根据实际情况而定
System.out.println(persons[i].say());//动态绑定机制
}
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String say(){
return name+"\t"+age;
}
}
class Student extends Person{
private double score;
public Student(String name, int age, double score) {
super(name, age);
this.score = score;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
@Override
public String say() {
return "学生"+super.say()+" score="+score;
}
}
class Teacher extends Person{
private double salary;
public Teacher(String name, int age, double salary) {
super(name, age);
this.salary = salary;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String say() {
return "老师"+super.say()+" salary="+salary;
}
}
应用实例升级:
如何调用子类特有的方法,
比如Teacher的teach方法,Student的study方法
代码演示:
public class poly_arr02 {
public static void main(String[] args) {
Person[] persons=new Person[5];
persons[0]=new Person("jack",20);
persons[1]=new Student("jack",18,100);
persons[2]=new Student("smith",19,80);
persons[3]=new Teacher("scott",30,20000);
persons[4]=new Teacher("king",50,30000);
// 遍历多态数组
for (int i=0;i<persons.length;i++){
// persons[i]的编译类型是Person,运行类型则根据实际情况而定
System.out.println(persons[i].say());//动态绑定机制
//
if (persons[i] instanceof Student){//判断persons[i]的运作类型是不是Student
((Student) persons[i]).study(); //向下转型
}else if (persons[i] instanceof Teacher){//判断persons[i]的运作类型是不是Teacher
((Teacher)persons[i]).teach();//向下转型
}else if (persons[i] instanceof Person){
} else {
System.out.println("你的类型有误,请总自己检查");
}
}
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String say(){
return name+"\t"+age+"岁";
}
}
class Student extends Person{
private double score;
public Student(String name, int age, double score) {
super(name, age);
this.score = score;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
@Override
public String say() {
return "学生"+super.say()+" score="+score;
}
public void study(){
System.out.println("学生"+getName()+" 正在学习java...");
}
}
class Teacher extends Person{
private double salary;
public Teacher(String name, int age, double salary) {
super(name, age);
this.salary = salary;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String say() {
return "老师"+super.say()+" salary="+salary;
}
public void teach(){
System.out.println("老师"+getName()+" 正在讲课");
}
}
运行结果:
jack 20岁
学生jack 18岁 score=100.0
学生jack 正在学习java...
学生smith 19岁 score=80.0
学生smith 正在学习java...
老师scott 30岁 salary=20000.0
老师scott 正在讲课
老师king 50岁 salary=30000.0
老师king 正在讲课
- 多态参数
方法定义的形参类型为父类类型,实参类型允许为子类类型
应用实例:
定义员工类Employee,包含姓名和月工资【private】
以及计算年工资getAnnual的方法
普通员工类worker和经理类Manager继承员工类
经理类多了个奖金bonus属性和管理manage方法
普通员工类多了个work方法
普通员工和经理类要求分别重写getAnnual方法
测试类Test类中定义一个静态方法showEmpAnnual(Employee e),
实现获取任何员工对象的年工资,并在main方法中调用该方法
测试类中定义一个静态方法testWork。如果该类是普通员工类,则调用work方法
如果是经理类,则调用manage方法。
代码演示:
Test类
public class Test {
public static void main(String[] args) {
worker tom = new worker("tom", 2500);
Manager milan = new Manager("milan", 5000, 2000);
showEmpAnnual(tom);
showEmpAnnual(milan);
testWork(tom);
testWork(milan);
}
//
public static void showEmpAnnual(Employee e){
System.out.println(e.getName()+"的工资="+e.getAnnual());
}
public static void testWork(Employee e){
if (e instanceof worker){
((worker) e).work();//向下转型
}else if (e instanceof Manager){
((Manager) e).manage();//向下转型
}else {
System.out.println("不做处理");
}
}
}
Employee类(父类)
public class Employee {
private String name;
private double salary;
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public double getAnnual(){
return 12 * salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
worker类
public class worker extends Employee{
public worker(String name, double salary) {
super(name, salary);
}
public void work(){
System.out.println("普通员工"+getName() +" is working");
}
@Override
//因为普通员工没有其他的收益,所以直接调用父类的方法就行
public double getAnnual() {//因为普通员工没有其他的收益,所以直接调用父类的方法就行
return super.getAnnual();
}
}
Manager类
public class Manager extends Employee{
private double bonus;
public Manager(String name, double salary, double bonus) {
super(name, salary);
this.bonus = bonus;
}
public void manage(){
System.out.println("经理 "+getName()+" is managing");
}
@Override
public double getAnnual() {
return super.getAnnual()+bonus;
}
public double getBonus() {
return bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
}
运行结果:
tom的工资=30000.0
milan的工资=62000.0
普通员工tom is working
经理 milan is managing