Java基礎之:OOP——多型練習題
應用案例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\t面積(area):%.2f\n",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();
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/232277.html
標籤:Java
上一篇:Java基礎之:OOP——多型
