java笔记--day09--抽象类(二)

来源:互联网 发布:python netsnmp安装 编辑:程序博客网 时间:2024/06/05 20:09
  • 1 抽象类成员特点

    • 成员变量
      可以是变量,也可以是常量
    • 构造方法
      有构造方法,但是不能实例化。其作用是用于子类访问父类数据的初始化(as usual)
    • 成员方法
    • 抽象类成员方法,用于强制要求实体子类重写其所有抽象方法
    • 也可以有非抽象的方法,用于提高代码的复用性
  • 2 案例概述:

    • 2.1老师案例(没有用到多态polymorphism,这叫抽象类多态)
      具体事物:基础班老师,实验班老师
      共性:姓名,年龄,讲课。
      其中讲课内容不一样,而且是必须要讲的,所以用abstract class,强制子类完成该方法
abstract class Teacher{    private String name;    private int age;    public Teacher(){}    public Teacher(String name,int age){        this.name = name;        this.age = age;    }    //getXxx() and 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;    }    public void show(){        System.out.println("The teacher's name is "+name);        System.out.println("The teacher's age is "+age);    }    //abstract class    public abstract void Teach();}class BasicTeacher extends Teacher{    public BasicTeacher(String name,int age){        super(name,age);    }    public void Teach(){        System.out.println("BasicTeacher teaches basic knowledge.");    }}class ExperimentTeacher extends Teacher{    public ExperimentTeacher(){}    public ExperimentTeacher(String name,int age){        super(name,age);    }    public void Teach(){        System.out.println("ExperimentTeacher teaches experiments.");    }}class AbstractDemo2{    public static void main(String[] args) {        BasicTeacher b = new BasicTeacher("Liu Shishi",27);        b.show();        b.Teach();        System.out.println();        ExperimentTeacher e = new ExperimentTeacher();        e.setName("TangWei");        e.setAge(28);        e.show();        e.Teach();    }}/*running result:The teacher's name is Liu ShishiThe teacher's age is 27BasicTeacher teaches basic knowledge.The teacher's name is TangWeiThe teacher's age is 28ExperimentTeacher teaches experiments.*/
  • 2.2学生案例(使用了多态polymorphism)
    • 具体事务:基础班学员,就业班学员
      共性:姓名,年龄,班级,学习
      其中姓名,年龄,班级是相同的。而学习因为班级的不同,从而导致学习的内容也不同,所以学习方法定义为抽象方法,并强制每个子类都要求学习(因为是学生啊哈哈哈哈哈)
abstract class Student{    private String name;    private int age;    private  int sclass;    public Student(){}    public Student(String name,int age,int sclass){        this.name = name;        this.age = age;        this.sclass = sclass;    }    //getXxx() and 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;    }    public int getSclass(){        return sclass;    }    public void setSclass(int sclass){        this.sclass = sclass;    }    public void show(){        System.out.println("The student's name is "+name);        System.out.println("The student's age is "+age);        System.out.println("The student's sclass is "+sclass);    }    public abstract void learn();}class BasicStudent extends Student{    public BasicStudent(){}    public BasicStudent(String name,int age,int sclass){        super(name,age,sclass);    }    public void learn(){        System.out.println("BasicStudents learn basic knowledge.");    }}class ExperimentStudent extends Student{    public ExperimentStudent(){}    public ExperimentStudent(String name,int age,int scalss){        super(name,age,scalss);    }    public void learn(){        System.out.println("ExperimentStudents learn experiment knowledge.");    }}class AbstractDemo3{    public static void main(String[] args) {        Student s = new BasicStudent("Hu Ge",22,1);        System.out.println("The student's name is "+s.getName()+",age is "+s.getAge()+",and class is "+s.getSclass());        s.learn();        System.out.println();        s = new ExperimentStudent();        s.setName("Huo Gianhua");        s.setAge(23);        s.setSclass(2);        System.out.println("The student's name is "+s.getName()+",age is "+s.getAge()+",and class is "+s.getSclass());        s.learn();    }}/*running result:The student's name is Hu Ge,age is 22,and class is 1BasicStudents learn basic knowledge.The student's name is Huo Gianhua,age is 23,and class is 2ExperimentStudents learn experiment knowledge.*/
  • 2.3 员工案例
    • 题目:
      假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。
      经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
      请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。
    • 分析:
      共同的成员:姓名、工号、工资和工作
      奖金是经理独有成员方法

代码Demo:

abstract class Employee{    private String name;    private String id;    private int wage;    public Employee(){}    public Employee(String name,String id,int wage){        this.name = name;        this.id = id;        this.wage = wage;    }     //getXxx and setXxx    public String getName(){        return name;    }    public void setName(String name){        this.name = name;    }    public String getId(){        return id;    }    public void setId(String id){        this.id = id;    }    public int getWage(){        return wage;    }    public void setWage(int wage){        this.wage = wage;    }    //abstract class    public abstract void work();}class Programmer extends Employee{    public Programmer(){}    public Programmer(String name,String id,int wage){        super(name,id,wage);    }    public void work(){        System.out.println("Programmer work.");    }}class Manager extends Employee{    private int bonus;    public Manager(){}    public Manager(String name,String id,int wage,int bonus){        super(name,id,wage);        this.bonus = bonus;    }    public int getBonus(){        return bonus;    }    public void setBonus(int bonus){        this.bonus = bonus;    }    public void bonus(){        System.out.println("Manager has a bonus of 100000 yuan per year.");    }    public void work(){        System.out.println("Manager manages.");    }}class AbstractDemo4{    public static void main(String[] args) {        Employee em = new Programmer();        em.setName("Xu");        em.setWage(10000);        em.setId("zj6666666");        System.out.println(em.getName()+"   "+em.getId()+"    "+em.getWage());        em.work();        System.out.println();        em = new Programmer("John","zj233333",111111);        System.out.println(em.getName()+"   "+em.getId()+"    "+em.getWage());        em.work();/*      em = new Manager();        em.setName("Liu Shishi");        em.setWage(15000);        em.setId("zj999999");        em.setBonus(120000);        System.out.println(em.getName()+"   "+em.getId()+"    "+em.getWage()+"    "+em.getBonus());        wrong runnig result:        AbstractDemo4.java:86: 错误: 找不到符号                        em.setBonus(120000);                          ^          符号:   方法 setBonus(int)          位置: 类型为Employee的变量 em        AbstractDemo4.java:87: 错误: 找不到符号                        System.out.println(em.getName()+"   "+em.getId()+"    "+em.getWage()+"    "+em.getBonus());                                                                                                      ^          符号:   方法 getBonus()          位置: 类型为Employee的变量 em        2 个错误        */        //creat a new object        Manager ma = new Manager();        ma.setName("Liu Shishi");        ma.setWage(15000);        ma.setId("zj999999");        ma.setBonus(120000);        System.out.println(ma.getName()+"   "+ma.getId()+"    "+ma.getWage()+"    "+ma.getBonus());        ma.work();    }}/*running result:Xu   zj6666666    10000Programmer work.John   zj233333    111111Programmer work.Liu Shishi   zj999999    15000    120000Manager manages.*/

从员工代码Demo中,万一出现了子类特有的功能时,不能通过多态的方法访问(这是多态的弊端)。所以只能创建一个新的对象来访问该方法。

0 0
原创粉丝点击