繼承與多型的一個簡單例項
阿新 • • 發佈:2018-11-17
程式結構:
父為Person類,Person類個子類Student和Employee,Employee類又有兩個子類,Staff和Faculty。
繼承即子類可以繼承父類的資料域和方法:
Student類和Employee類繼承了Person類的資料域name,address phoneNumber E_mail className 以及他們的set方法和get方法。同時Emloyee類中聲明瞭新的資料域office,wage,date以及他們的set get方法。Student類有新的grade資料域和方法。
Staff和Faculty類繼承了Employee類中的所有方法,包括從Person類中繼承來的方法,同時有定義了自己的新方法。
同時,子類通過super呼叫了父類設定日期的構造方法和toString方法。
多型:
TestPerson類中建立了Student,Staff和Faculty型別的物件
在呼叫toString時,每個類都有自己對toString方法的實現(子類覆蓋了父類的toString方法),最終的輸出結果取決於物件的型別,體現了動態繫結。
package person;
//父類
public class Person {
protected String name ; //姓名
protected String address; //地址
protected String phoneNumber; //電話號碼
protected String E_mail; //電子郵件
protected String className; //類名,即學生、職員、教員
public void setE_mail() {
this.E_mail=E_mail;
}
public String getE_mail() {
return E_mail;
}
public void setPhoneNumber() {
this.phoneNumber= phoneNumber;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setClassName() {
this.className=className;
}
public String getClassName() {
return className;
}
public void setAddress() {
this.address=address;
}
public String getAddress() {
return address;
}
public void setName() {
this.name=name;
}
public String getName() {
return name;
}
public String toString() {
return getClassName()+" \n"+getName()+" \nphnone number is:\n"+getPhoneNumber()+" \nE-mail is :\n"+getE_mail()+" \naddress is :\n"+getAddress();
}
}
package person;
public class Student extends Person{
protected String grade;
final static int RRESHMAN=1;
final static int SOPHOMORE=2;
final static int JUNIOR=3;
final static int SENIOR=4;
public void setGrade() {
this.grade=grade;
}
public String getGrade() {
return grade;
}
public Student(String className,String name,String grade,String phoneNumber,String E_mail,String address) {
this.className=className;
this.name=name;
this.grade=grade;
this.phoneNumber=phoneNumber;
this.E_mail=E_mail;
this.address=address;
}
public String toString() {
return super.toString()+"\ngrade is :\n"+grade;
}
}
package person;
public class Employee extends Person {
protected String office; //辦公室
protected double wage; //工資
MyDate date; //MyDate的一個物件,作用是在employee裡面建立一個構造方法,使在子類中能呼叫他的構造方法
public Employee(int year,int month,int day) {
this.date=new MyDate(year,month,day);
}
public void setOffice() {
this.office=office;
}
public String getOffice() {
return office;
}
public void setWage() {
this.wage=wage;
}
public double getWage() {
return wage;
}
public String toString() {
return super.toString()+"\noffice is :\n"+getOffice()+"\nwage is :\n"+getWage()+"\nthe year is :\n"+MyDate.getYear()+
"\nthe month is:\n"+MyDate.getMonth()+"\nthe day is:\n"+MyDate.getDay();
}
}
package person;
//教員
public class Faculty extends Employee {
protected String rank; //等級
protected String time; //工作時間如9:00-13:00
public void setRank() {
this.rank=rank;
}
public String getRank() {
return rank;
}
public void setTime() {
this.time=time;
}
public String getTime() {
return time;
}
public Faculty(String className,String name,String rank,String phoneNumber,String E_mail,String address,String office,double wage,String time,int year,int month,int day){
super(year,month,day);
this.className=className;
this.name=name;
this.rank=rank;
this.phoneNumber=phoneNumber;
this.E_mail=E_mail;
this.address=address;
this.office=office;
this.wage=wage;
this.time=time;
}
public String toString() {
return super.toString()+"\nrank is :\n"+rank+"\nthe work time is:\n"+time;
}
}
package person;
//職員
public class Staff extends Employee {
protected String staffTitle; //職位
public void setStaffTitle() {
this.staffTitle=staffTitle;
}
public String getStaffTitle() {
return staffTitle;
}
public Staff(String className,String name,String staffTitle,String phoneNumber,String E_mail,String address,String office,double wage,int year,int month,int day) {
super(year,month,day);
this.className=className;
this.name=name;
this.staffTitle=staffTitle;
this.phoneNumber=phoneNumber;
this.E_mail=E_mail;
this.address=address;
this.name=name;
this.office=office;
this.wage=wage;
}
public Staff() { //無參的構造方法,預設方法
this("staff","lisi","cleaner","1527319","[email protected]","北京市","機械院203",3000,2015,3,12);
}
public String toString() {
return super.toString()+"\nstaffTitle is :\n"+staffTitle;
}
}
package person;
public class MyDate {
public static int year;
public static int month;
public static int day;
public MyDate(int year,int month,int day) {
this.year=year;
this.month=month;
this.day=day;
}
public void setYear() {
this.year=year;
}
public static int getYear() {
return year;
}
public void setMonth() {
this.month=month;
}
public static int getMonth() {
return month;
}
public void setDay() {
this.day=day;
}
public static int getDay() {
return day;
}
}
package person;
public class TestPerson {
public static void main(String[] args) {
m(new Student("student","zengmeng","junior","12345","[email protected]","四川成都")); //初始化學生物件
m(new Faculty("Faculty","zhangsan","associate professor","139822","[email protected]","湖南長沙","環境院408",10000,"9:00-18:00",2018,6,20));
m(new Staff()); //初始化職員物件,無參構造
}
public static void m(Object x) {
System.out.println(x.toString()); //輸出
}
}
執行結果