java笔记--day09--抽象类(二)
来源:互联网 发布:python netsnmp安装 编辑:程序博客网 时间:2024/06/05 20:09
1 抽象类成员特点
- 成员变量
可以是变量,也可以是常量 - 构造方法
有构造方法,但是不能实例化。其作用是用于子类访问父类数据的初始化(as usual) - 成员方法
- 抽象类成员方法,用于强制要求实体子类重写其所有抽象方法
- 也可以有非抽象的方法,用于提高代码的复用性
- 成员变量
2 案例概述:
- 2.1老师案例(没有用到多态polymorphism,这叫抽象类多态)
具体事物:基础班老师,实验班老师
共性:姓名,年龄,讲课。
其中讲课内容不一样,而且是必须要讲的,所以用abstract class,强制子类完成该方法
- 2.1老师案例(没有用到多态polymorphism,这叫抽象类多态)
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
- java笔记--day09--抽象类(二)
- java笔记--day09--抽象类(一)
- java笔记--day09--多态(二)
- java笔记--day09--接口(三)抽象类和接口的区别
- java笔记--day09--接口(二)接口成员特点
- 毕向东Java视频学习笔记【Day09 继承+接口+抽象类】
- Java基础:Day09笔记内容 (继承)
- java笔记--day09--多态(一)
- java笔记--day09--接口(一)
- java笔记--day09--接口(四)练习
- [Java视频笔记]day09
- day09多态、接口、抽象类
- java笔记--day09--final关键字
- java学习笔记(二十四)抽象类
- java笔记--day09--接口(三)类和接口的关系
- 面向对象 (多态)+JAVA学习笔记-DAY09
- day09笔记
- 黑马程序员 java学习笔记(day09)
- Majority Element
- 常用正则表达式
- ubuntu14.04 切换 python版本
- 利用Matlab设计滤波器(FDAT)
- 39.超文本标记语言HTML详解(下)
- java笔记--day09--抽象类(二)
- 决策树
- 51nod-1065
- AIM Tech Round 3 (Div. 2) C. Letters Cyclic Shift 贪心、字典序
- ssh整合-[Ljava.lang.String Date类型存入出现异常解决
- BZOJ1828: [Usaco2010 Mar]balloc 农场分配 贪心+线段树
- 常用linux命令(java开发)
- Java中的float和long
- django创建一个项目