封装、继承、多态基础练习

  • 初学java的封装、继承、多态,前面已经对基本概念进行了总结
  1. 先说一下java的动态绑定机制(非常非常重要***)
  1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
  2. 当调用对象属性时,没有动态绑定机制,哪里声明,哪里就使用

封装、继承、多态基础练习_第1张图片

 

 2.例题
//题目描述

1.定义员工类Employee,包含姓名和月工资[private],以及计算年工资getAnnual的方法。

2.普通员工和经理继承了员工,经理类多了奖金bonus属性和管理manage方法,普通员工类多了work方法。

3.普通员工和经理类要求分别重写getAnnual方法

4.测试类中添加一个方法showEmpAnnual(Employee e), 实现获取任何员工对象的年工资,并在main方法中调用该方法[e.getAnnua()]

5.测试类中添加一个方法,testWork,如果是普通员工,则调用work方法, 如果是经理,则调用manage方法

源代码

//测试类

package com.emp;

import com.polyparameter_.Wordks;

public class TextEmp {
    public static void main(String[] args) {
            Manager manager = new Manager("李强",8000,20000);
        Work work = new Work("张三",5000);
        TextEmp text = new TextEmp();  //这里必须new 创建方法空间才能将员工传入TextEmp方法中
        text.testWork(manager);
        text.showEmpAnnual(manager);  //动态绑定机制,.的是方法,在运行类型中查找
        text.testWork(work);
        text.showEmpAnnual(work);
    }
    //testWork 方法调用的是子级的方法,要才能进行向下转型
    public void testWork(Employee e ) {
        if(e instanceof Manager) {
            ((Manager)e).manage();
        }
        else if(e instanceof Work) {
            ((Work)e).work();
        }
        else{
            System.out.println("暂无此类员工!");
        }
    }
    public void  showEmpAnnual(Employee e) {
        System.out.println(e.getName()+"的年薪为:"+ e.getAnnual()+"钱");//动态绑定机制
    }
}

//Employee 类

package com.emp;

public class Employee {
    private  String name;       // 姓名
    private double mothSalary;  //月工资

//    无参构造
    public Employee() {}
//    构造函数
    public Employee(String name, double mothSalary) {
        this.name = name;
        this.mothSalary = mothSalary;
    }
//    计算年工资方法,返回值为double
    public double getAnnual() {
        return 12*mothSalary;
    }
//get/set 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMothSalary() {
        return mothSalary;
    }

    public void setMothSalary(double mothSalary) {
        this.mothSalary = mothSalary;
    }
}

//Manager类

package com.emp;

public class Manager extends Employee{
    private double bonus;  //经理的年终奖金
//    无参构造
    public Manager() {}
//    构造函数

    public Manager(String name, double mothSalary, double bonus) {
        super(name, mothSalary);   //super 继承父级属性
        this.bonus = bonus;
    }
//manage 方法
    public void manage() {
        System.out.println("经理:"+getName()+":do management~");
    }
//     重写年薪方法@Override关键字,通过重写的规则去验证方法
    @Override
    public double getAnnual() {
        return super.getAnnual()+bonus;
    }

    //    get/set 方法
    public double getBonus() {
        return bonus;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }
}

//Work类

package com.emp;

public class Work extends Employee {
//    无参构造
    public Work() {}
    //    构造函数
    public Work(String name, double mothSalary) {
        super(name, mothSalary);
    }

    public  void work() {
        System.out.println("员工:"+getName()+":is working~");
    }
//    重写年薪方法
    @Override
    public double getAnnual() {
        return super.getAnnual();
    }
}

运行结果:

封装、继承、多态基础练习_第2张图片

 

你可能感兴趣的:(java实战,java,开发语言)