应用案例1:
编写教师类
要求有属性“姓名name”,“年龄age”,“职称post”,“基本工资salary”
编写业务方法, introduce(),实现输出一个教师的信息。
编写教师类的三个子类:教授类(professor)、副教授类(vice professor)、讲师类(lecturer)。
工资级别分别为:教授为1.3、副教授为1.2、讲师类1.1。在三个子类里面都重写父类的introduce()方法。
定义并初始化一个老师对象,调用业务方法,实现对象基本信息的后台打印。
package polymorphic_HomeWork; public class WorkTest_01 { public static void main(String[] args) { Teacher professor = new Professor("小范",20,"professor",4000.0); Teacher viceProfessor = new ViceProfessor("小黄",18,"ViceProfessor",3000.0); Teacher lecturer = new Lecturer("小雨",19,"lecturer",2000.0); System.out.println(professor.introduce()); System.out.println(viceProfessor.introduce()); System.out.println(lecturer.introduce()); } } //要求有属性“姓名name”,“年龄age”,“职称post”,“基本工资salary”, //编写业务方法, introduce(),实现输出一个教师的信息。 class Teacher{ private String name; private int age; private String post; private double salary; public Teacher(String name, int age, String post, double salary) { super(); this.name = name; this.age = age; this.post = post; this.salary = salary; } public Teacher() { super(); } 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 String getPost() { return post; } public void setPost(String post) { this.post = post; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } //introduce(),实现输出一个教师的信息。 public String introduce() { return "Teacher [name=" + name + ", age=" + age + ", post=" + post ; } } //教授类(professor) class Professor extends Teacher{ private double level; public Professor(String name, int age, String post, double salary) { super(name, age, post, salary); this.level = 1.3; } public double getLevel() { return level; } public void setLevel(double level) { this.level = level; } @Override public String introduce() { // TODO Auto-generated method stub return "Professor " + super.introduce() + ", salary=" + getSalary()*level + "]"; } } //副教授类(vice professor) class ViceProfessor extends Teacher{ private double level; public ViceProfessor(String name, int age, String post, double salary) { super(name, age, post, salary); this.level = 1.2; } public double getLevel() { return level; } public void setLevel(double level) { this.level = level; } @Override public String introduce() { // TODO Auto-generated method stub return "ViceProfessor " + super.introduce() + ", salary=" + getSalary()*level + "]"; } } //讲师类(lecturer) class Lecturer extends Teacher{ private double level; public Lecturer(String name, int age, String post, double salary) { super(name, age, post, salary); this.level = 1.1; } public double getLevel() { return level; } public void setLevel(double level) { this.level = level; } @Override public String introduce() { // TODO Auto-generated method stub return "Lecturer " + super.introduce() + ", salary=" + getSalary()*level + "]"; } }
应用案例2:
设计父类—员工类。子类:工人类(Worker),农民类(Peasant),教师类(Teacher),科学家类(Scientist),服务生类(Waiter)。
(1) 其中工人,农民,服务生只有基本工资。
(2) 教师除基本工资外,还有课酬(元/天)。
(3) 科学家除基本工资外,还有年终奖(bonus)。
(4) 编写一个测试类,将各种类型的员工的全年工资打印出来。
package polymorphic_HomeWork; public class WorkTest_02 { public static void main(String[] args) { Employee worker = new Worker("工人 小范",20,2000); Employee peasant = new Peasant("农民 小范",40,1000); Employee waiter = new Waiter("服务生 小范",25,3000); Employee teacher = new Teacher("老师 小范",30,4000,50,200); Employee Scientist = new Scientist("科学家 小范",35,3500,250000); //这里创建的对象的编译类型都是Employee // System.out.println(worker.toString()); // System.out.println(peasant.toString()); // System.out.println(waiter.toString()); // System.out.println(teacher.toString()); // System.out.println(Scientist.toString()); WorkTest_02 wt = new WorkTest_02(); wt.showAll(Scientist); wt.showAll(teacher); wt.showAll(waiter); wt.showAll(peasant); wt.showAll(worker); } public void showAll(Employee e) { //当有对象传入时,它的编译类型就变为了Employee。 //由于子类重写了父类的show方法,而这里e的运行类型是动态绑定了的。 //所以会自动的寻找到传入类型所对应的show方法 //父类的show方法,相当于让编译器可以通过编译。如果父类中没有show方法会报语法错误。 //因为e的编译类型为Employee. e.show(); } } class Employee{ private String name; private int age; private double salary; public Employee(String name, int age, double salary) { super(); this.name = name; this.age = age; this.salary = salary; } public Employee() { super(); } 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 double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public void show() { System.out.println(toString()); } @Override public String toString() { return "name=" + name + ", age=" + age; } //提供一个方法返回基本年薪,子类可以在此基础上进行修改 public double yearSalary() { return salary * 12; } } //工人类(Worker) class Worker extends Employee{ public Worker(String name, int age, double salary){ super(name,age,salary); } @Override public void show() { System.out.println("Worker : " + super.toString() + ", salary: " + yearSalary()); } } //农民类(peasant) class Peasant extends Employee{ public Peasant(String name, int age, double salary){ super(name,age,salary); } @Override public void show() { System.out.println("Peasant : " + super.toString() + ", salary: " + yearSalary()); } } //服务生类(waiter) class Waiter extends Employee{ public Waiter(String name, int age, double salary){ super(name,age,salary); } @Override public void show() { System.out.println("Waiter : " + super.toString() + ", salary: " + yearSalary()); } } //教师类(teacher),教师除基本工资外,还有课酬(元/天)。 class Teacher extends Employee{ private double dollars; //课酬 private int workDays; //工作天数 public Teacher(String name, int age, double salary, double dollars, int workDays) { super(name, age, salary); this.dollars = dollars; this.workDays = workDays; } public int getWorkDays() { return workDays; } public void setWorkDays(int workDays) { this.workDays = workDays; } public double getDollars() { return dollars; } public void setDollars(double dollars) { this.dollars = dollars; } @Override public void show() { System.out.println( "Teacher : " + super.toString() + ", salary: " + (yearSalary()+dollars*workDays)); } } //科学家类(scientist), 科学家除基本工资外,还有年终奖(bonus)。 class Scientist extends Employee{ private double bonus; public Scientist(String name, int age, double salary, double bonus) { super(name, age, salary); this.bonus = bonus; } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } @Override public void show() { System.out.println("Scientist : " + super.toString() + ",salary:" + (yearSalary()+bonus)); } }
应用案例3:
定义一个图形类Picture,再定义Picture的两个子类:圆形类Circle、矩形类Rect。 要求: 图像类:有求周长和求面积和显示图形信息的功能。 圆形类:包含圆心和半径,重写求周长和求面积的方法。 矩形类:包含长和宽,重写求周长和求面积的方法。
package polymorphic_HomeWork; public class WorkTest_03 { public static void main(String[] args) { Picture circle = new Circle("2,2",3.1); Picture rect = new Rect(6.4,5.3); circle.show(); rect.show(); } } //图像类:有求周长和求面积和显示图形信息的功能。 class Picture{ private double sideLength; //边长 private int sideCount; //边数 public Picture(double sideLength, int sideCount) { super(); this.sideLength = sideLength; this.sideCount = sideCount; } public Picture() { super(); } public double getSideLength() { return sideLength; } public void setSideLength(double sideLength) { this.sideLength = sideLength; } public int getSideCount() { return sideCount; } public void setSideCount(int sideCount) { this.sideCount = sideCount; } public double perimeter(){ //求周长 return sideCount * sideLength; } public double area() { //求面积 return 0.0; } public void show() { System.out.printf("周长(perimeter):%.2f 面积(area):%.2f ",perimeter(),area()); } } //圆形类Circle:包含圆心和半径,重写求周长和求面积的方法。 class Circle extends Picture{ private String centerCircle; //圆心:"X,Y" private double radius; //半径 public Circle(String centerCircle, double radius) { super(); this.centerCircle = centerCircle; this.radius = radius; } public String getCenterCircle() { return centerCircle; } public void setCenterCircle(String centerCircle) { this.centerCircle = centerCircle; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } @Override public double perimeter(){ //求周长 return 2 * radius * Math.PI; } @Override public double area() { //求面积 return radius * radius * Math.PI; } @Override public void show() { System.out.printf("Circle:圆心为 :%S ",centerCircle); super.show(); } } //矩形类Rect:包含长和宽,重写求周长和求面积的方法。 class Rect extends Picture{ private double length;//长 private double wide;//宽 public Rect( double length, double wide) { super(); this.length = length; this.wide = wide; } public double getLength() { return length; } public void setLength(double length) { this.length = length; } public double getWide() { return wide; } public void setWide(double wide) { this.wide = wide; } @Override public double perimeter(){ //求周长 return 2 * length + 2 * wide; } @Override public double area() { //求面积 return length * wide; } @Override public void show() { System.out.print("Rect: "); super.show(); } }