面向对象--抽象类--抽象类的练习

抽象类的练习

/*
        猫狗案例
            具体事物:猫,狗
            共性:姓名,年龄,吃饭
        分析:从具体分析到抽象的过程
            猫:Cat
                成员变量:姓名,年龄
                构造方法:无参构造,有参构造
                成员方法:吃饭(猫吃鱼)

            狗:Dog
                成员变量:姓名,年龄
                构造方法:无参构造,有参构造
                成员方法:吃饭(狗吃肉)

            通过分析我们发现,两个类存在相同的内容,所以提取出一个抽象类:Animal6

            抽象动物类:
                成员变量:姓名,年龄
                构造方法:无参构造,有参构造
                成员方法:吃饭(该方法是抽象的,没有具体的实现)
*/

//定义一个抽象动物类
abstract class Animal6 {
    //姓名
    private String name;
    //年龄
    private int age;
    //无参构造
    Animal6() {

    }
    //有参构造
    Animal6(String name, int age) {
        this.name = name;
        this.age = age;
    }
//    getXxx()和setXxx()方法
    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;
    }

    //show方法,输出所有的成员变量值
    public void show() {
      //其中隐含了this关键字
        System.out.println("姓名:" + this.name + ",年龄:" + this.age);
    }

    //吃饭的抽象方法
    public abstract void eat();
}

class Dog6 extends Animal6 {

    Dog6() {

    }

    Dog6(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}

class Cat6 extends Animal6 {

    Cat6() {

    }

    Cat6(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

public class AbstractTest2 {
    public static void main(String[] args) {
        //使用多态创建第一个对象
        Animal6 a = new Dog6("小白", 3);
        a.show();
        a.eat();

        //创建第二个对象,使用公共的getXxx和setXxx进行赋值
        Animal6 a2 = new Dog6();
        a2.setName("大黄");
        a2.setAge(4);
        a2.show();
        a2.eat();

        //创建第三个对象
        Animal6 a3 = new Cat6("小黑",2);
        a3.show();
        a3.eat();
    }
}
/*
        老师案例
            具体事物:基础班老师,大数据班老师
            共性:姓名,年龄,讲课。
*/

abstract class Teacher{
    private String name;
    private int age;

    public Teacher() {
    }

    public Teacher(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 abstract void teach();
}

class JavaTeacher extends Teacher{

    public JavaTeacher() {
    }

    public JavaTeacher(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("教java SE基础");
    }
}

class BigDataTeacher extends Teacher{

    public BigDataTeacher() {
    }

    public BigDataTeacher(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("教大数据");
    }
}

public class AbstractTest3 {
    public static void main(String[] args) {
        //创建一个对象,使用构造方法给成员变量进行赋值,并使用getXxx获取值
        //抽象多态的形式创建对象
        Teacher t1 = new JavaTeacher("小虎",18);
        System.out.println(t1.getName()+"---"+t1.getAge());
        t1.teach();

        //创建一个对象,使用setXxx对成员变量进行赋值,并使用getXxx获取值
        Teacher t2 = new BigDataTeacher();
        t2.setName("火火");
        t2.setAge(19);
        System.out.println(t2.getName()+"---"+t2.getAge());
        t2.teach();
    }
}
/*
    假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。
    经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
    请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。

    分析:
        普通员工:
            成员变量:姓名,工号,工资
            成员方法:工作(搬砖)
        经理:
            成员变量:姓名,工号,工资,奖金
            成员方法:工作(做PPT)

    实现:
        员工类:(抽象类)
        普通员工类:
        经理:
*/

//定义一个员工类
abstract class Staff {
    private String name;
    private int age;
    private String id;
    private int salary;

    public Staff() {
    }

    public Staff(String name, int age, String id, int salary) {
        this.name = name;
        this.age = age;
        this.id = id;
        this.salary = salary;
    }
  
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    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 abstract void work();
}

//定义一个具体的普工类
class CommonWorker extends Staff{

    public CommonWorker() {
    }

    public CommonWorker(String name, int age, String id,int salary) {
        super(name, age, id, salary);
    }

    @Override
    public void work() {
        System.out.println("搬砖");
    }
}

class Manager extends Staff{
    //私有的奖金属性
    private int bonus;

    public Manager() {
    }

    public Manager(String name, int age, String id, int salary, int bonus) {
        super(name, age, id, salary);
        this.bonus = bonus;
    }

    public int getBonus() {
        return bonus;
    }

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

    @Override
    public void work() {
        System.out.println("做PPT");
    }
}

public class AbstractTest4 {
    public static void main(String[] args) {
        //多态创建第一个对象
        Staff cw1 = new CommonWorker("李玉伟", 18, "Alibaba2000", 20000);
        cw1.work();

        //多态创建第二个对象
        Staff s2 = new Manager();
        s2.setName("杨旭");
        s2.setAge(23);
        s2.setId("TengXun1000");
        s2.setSalary(30000);
      
//      s2.setBonus(200000);
        //将s2进行向下转型

        Manager m = (Manager)s2;
        m.setBonus(200000);

        System.out.println(s2.getName()+"---"+s2.getAge()+"---"
                +s2.getId()+"---"+s2.getSalary()+"----"+((Manager) s2).getBonus());
        s2.work();
    }
}
posted @ 2021-12-11 23:57  赤兔胭脂小吕布  阅读(86)  评论(0编辑  收藏  举报