Java学习笔记73——抽象类的成员特点

抽象类的成员特点

成员变量

​ 可以是变量,也可以是常量

构造方法

​ 有构造方法,但是我们上一个程序中总结出抽象类不能实例化,那构造的意义是
​ 什么呢?要想初始化子类,就必须先初始化父类,在继承的关系中有用

成员方法

​ 可以有抽象方法 限定子类必须完成某些动作
​ 也可以有非抽象方法 提高代码复用性

abstract class Animal5{
    public int a;//常量
    public final int b = 20;//变量

    Animal5(){
        a = 20;
        System.out.println(a);
    }
}

class Dog5 extends Animal5{

}

public class AbstractDemo2 {
    public static void main(String[] args) {
        Dog5 dog5 = new Dog5();//初始化
    }
}

猫狗案例

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

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

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

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

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

    //无参构造
    Animal6() {

    }

    //有参构造
    Animal6(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;
    }

    //show方法,输出所有的成员变量值
    public void show() {
        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 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 Staff(String name, int age, String id, int salary) {
        this.name = name;
        this.age = age;
        this.id = id;
        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:16  欧朋  阅读(301)  评论(0)    收藏  举报