2023年面向对象类继承与接口实验报告.docx
实验十类继承与接口(二)课程名称:面向对象程序设计实验项目名称:实验十类继承与接口(二)学生姓名:专业:学号:实验地点: 实验日期:年月【实验目的】1 .掌握Java类的继承特点,涉及子类声明、对象创建2 .掌握域的继承与隐藏的特点和用法3 .掌握方法的继承与重写的特点和用法【实验内容】一.改错题检查下面代码是否有错,假如有错,写明错误因素,并修正错误。(1)cla s s Aaain t i;® Aaa()i=-1;, Aaa(int a) i = a;Aaa(double d) Aaa ( (int)d);是否犯错:是犯错因素(假如犯错):构造器调用构造器不能直接用名二.程序分析设计题下面各个设计要放在各自的包中。1 .最初设计最初设计的所有类都放到firs t包中(1)员工类的设计假设公司有三种类型的员工:经理(manager),高级工(advanced w o rkc r ),普通 工人(no r mal worker) o先分别设计描述这三种类型工人的类,规定如下: 三个类的名称分别为 Mana g e r ,AdvanccdWo r k e r, N o r ma 1 Worker;每个类都有n a me(姓名),id (工号),a g e(年龄),worki n gAg e (工龄)等pr i vale 类型的实例变量,而每个实例变量都有pub I i c类型的g e t和s ct方法。 每个类都要定义构造器,涉及无参数构造器和至少一个有参数构造器(用于对实例变量 赋初值)每个类都要定义一个p u blic型的salary方法,用于计算员工对象的每月薪水,并返回计 算结果,工资计算逻辑是:底薪+工龄工资。比如,经理的底薪是20230,此外根据工龄 每年加2 0 0元;高级工的底薪是10000元,另加每年100元的工龄工资;普通员工的底 薪是8000,另加每年8 0元的工龄工资。 其余功能可以自行考虑p u bi i c c 1 as s Man ager 定义name, id, a ge,wor k i ng Age等private类型的实例变量定义两个构造器,无参数构造器和有参数构造器puhl i c Ma nag er(String nam e ,S t r i ng idjnt age, i nt wor k in g A g补充对象初始化代码*/定义每个实例变最的pu b 1 ic类型的get和set方法。p u bli c doub 1 e sa 1 a ry()/* 代码补充*/p u bl i c cl a ss Adv ancedW o rke r 类似 Ma n agcr)p u bl i c cla s s Norma 1 Wo r k er 类似 Manager)(2)公司类的设计公司类用于描述公司,规定如下:类名:Com p any设计公司的P ri v at e实例变量有:公司名称(nam e兀三个员工对象数组(分别描述经理 们、高级工们、普通员工们)等,针对这些实例变量分别提供get和set方法。注意:为 了简化设计,这些员工对象数组的创建不在Company对象内部,而是通过有参数构造 器或者s e t方法从Company对象外部赋值到C o mpany对象内部。 提供构造器:涉及无参数构造器、两个有参数构造器(个要对所有实例变量初始赋值, 此外一个只需要对name赋值)。 设计实例方法totals alary,计算返回所有员工的工资,即对三个员工对象数组分别循 环累计汇总工资其余功能可以自行增长public c 1 ass C ompan y /priv a to 实例变量,涉及 name,以及 advan c cd Work e rs, norm a IWo r kers 两个对象数组/ M a nager对象数组作为示例,下面已经给出p r iv a te Manager1 ma n ag e r s ;设计无参数构造器/两个有参数构造器(一个要对所有实例变量初始赋值,此外一个只需要对n ame赋值)。C ompany(S( r in g namc,Managcr ma n age r s, A d va n ccdWorkcrf a d van c edWorke r s. Norm al Work e r nonna 1 Worker s )0/ /初始化代码)每个实例变量的get和set方法p u b 1 ic do u bl e toialSalary()记录经理们的工资总额:通过循环调用managers i的sal a ry方法,然后累加/ /记录高级工们的工资总额:通过循环调用a d van c edW o rkers i的salary方法,然后累 加记录普通工们的工资总额:通过循环调用no r m a lWorkersi的s a 1 a ry方法,然后累加返回上述三个工资总额的合计值(3)测试类p ubli c cla s s Te s t(»pu b lie s ta t ic void m a in( St r ing ) ar g s)Ma n ag e r manage r s=new M a na g e r2;/卜面示例两行代码手工创建Manager对象,并分别对man a gers的两个元素赋值managers 0 = new Man a g er("王一”,"001”,3 0 ,10):ma n agersf 11 = new Man a ger("张二","002”,40, 15);AdvancedWorker ) a d vanccdW o rkers = new Adva n ccdWorkcr4;参考上述代码,创建Adva need Worker对象,并分别对ad v ancedWo r k e rs的4个 元素赋值Norm a IWork e r normalWorke r s = new NormalW o rker 8;/同上,手工创建No r malW o rke r对象,并分别对normal Wo r k e r s的8个元素 赋值符上述三个员工对象作为参数传递到Com pan y对象内部。Company compa n y =new Compa n y (“公司名字",mana g er s , adv a n cedWo r kers,n o rma 1 W o r k ers );» Sys t em.o u t.pr i ntln ("公司年工资总额:"+comp a ny. t o t al S alaryO); 输出公司 工资总额).改善设计:运用类的基础和上转型重新设计现在对前面的最初设计进行改造。本次所有类都放到s e co nd包中。(1)设计员工类的继承结构前面的最初设计中,一个重要的缺陷就是代码反复,就是三种类型的员工类有许多反复 的代码,这时可以通过设计继承结构,将这些反复代码放到超类中,缓解代码反复问题。规定设计如下: 设H一个Wo r k c r类,该类描述员工,作为经理(man a g e r),高级I:(ad v anced worker),普通工人(n o rmal wo r k er)的共同的超类。 Wo r ker类提供子类的公共功能,即将子类的反复代码或类似代码移到W。rker类中。比如,: W ork e r类需要定义name (姓名),id (工号),ag e (年龄),workin g A g e (工 龄)等p r ivate类型的实例变量,而每个实例变量都有public类型的g e i和se t方 法。 Worker类定义两个构造器,涉及无参数构造器和一个有参数构造器(用于对四个实例变量赋初值)Wo r ke r类定义一个pub 1 ic型的salar y方法,用于计算员工对象的每月薪水, 具体代码在将来的子类中重定义(现在只需要返回0)。 三个子类 Man a ger、A d v a n cedWor k er Norm a IWork e r 从 Worker 类继承,规定: 每个子类定义各自的构造器,规定同最初设计,注意通过构造器调用链重用超类构 造器的代码(即通过s upcr调用超类构造器) 每个类都各自重定义Worker类的salary方法,用于计算员工对象的每月薪水,具体计算逻辑(与最初设计相同):底薪+工龄工资。比如,经理的底薪是2 023 0, 此外根据工龄每年加2 00元;高级工的底薪是1000 0元,另加每年100元的工龄 工资;普通员工的底薪是8 000,另加每年80元的工龄工资。 其余功能可以自行考虑p ublic cl a s s Worker定义name, id,a g e .workingAge等private类型的实例变量定义两个构造器,无参数构造器和有参数构造器pu b 1 ic W o rker( S trin g name, S tri ng i d ,i n t age, in t wo r king A ge)/*补充对象初始化代码*/)/定义每个实例变量的pub 1 ic类型的get和set方法。P ublic d o u ble salaiy()return 0; 具体的计算方法由子类重定义。)p u b 1 ic cla s s M a n a g e r extends Wo r ke r pu b lie M a na g er (String name, S tring id, i n t age, in t w o rk i n gAgc)/*补充对象初始化代码,调用抄类构造器的代码”)p u b 1 i c Manager ()/*补充对象初始化代码*/)p u bl i c d o u ble salary () r cturn 0; / /根据经理的工资计算逻辑重定义方法。/ /Advanc e dW o rker> Norma 1 Wo r ker 两个类的代码与 Manager 类似(2)重新设计公司类在最初设计的Compan y类的基础上,将代码改造,规定如下:类名:Company重新设计公司的实例变量,定义private实例变量:公司名称(n ame),W。r k er对象数组 (workers),此处与前面的设计不同,仅仅设计一个超类Worker对象数组,而不是定义三个 不同的三个子类对象数组,然后针对这些实例变量分别提供ge【和set方法。注意:为了 简化设计,这些员工对象数组的创建不在Company对象内部,而是通过有参数构造器或 者se t方法从Company对象外部赋值到Comp a ny对象内部。 提供构造器:涉及无参数构造器、两个有参数构造器(一个要对所有实例变量初始赋值, 此夕I、一个只需要对name赋值)。 设计实例方法tot a ISalary,计算返回所有员工的工资,即对workers对象数组循环 累计汇总工资(此处与最初设计不同,不用对三个子类数组分别循环记录)其余功能可以自行增长publ i c class Company(/ / priv a tc实例变量,涉及namepr i vateWork e r wo r kers ; /只需要定义1个超类类型的数组,不需要定义多个 子类对象数组设计无参数构造器/两个有参数构造器(一个要对所有实例变量初始赋值,此外一个只需要对n a me赋值) oC omp a ny(Strin g n a me, Wor k cr wor k e rs)对最初设计的代码进行简化/初始化代码。每个实例变量的g e t和set方法pub 1 ic do u ble tot a 1S alary()对最初设计的代码进行简化/记录员工的工资总额:通过循环调用workers i 的sa la ry方法,然后累加返回上述三个工资总额的合计值。)(3)改写测试类在最初设计的Test类的基础上改写代码。pu b i i c c 1 a ss T es t pub 1 ic stat i c vo i d ma i n( S t ri n g arg s ) Wo r ker worke r s = n e v Worker 1 4;员工数量共 14 个/下面示例两行代码手工创建Man a ger对象,并分别对man agers的两个元素赋值wor k e r s 0 = new M a na g e r (“王一”,“ 0 0 1 ”,30, 10); / / 创建子类 Manager 对象,并转型为超类workers 11 = n e w Ma n ager(“张二“,"00 2”, 4 0 , 15);/含义同上/参考上述代码,用4行代码分别创建Ad v a n c edWor k e r对象,并赋值给w o r k e r s的元素参考上述代码,用8行代码分别创建NormalWo r kcr对象,并赋值给wo r kc r s的 元素将上述三个员T.对象作为参数传递到Comp a ny对象内部。C o mpany company= n ew Comp a n y ("公司名字",wor k e r s );»S y st e m.o u t. println ("公司年工资总额:"+compa n y.to t alSa 1 ary()J / 输出公司工资3.改善设计:将超类设计为抽象类现在对前面的改善设计进行改造。本次所有类都放到third包中。前面设计的一个缺陷是:超类Worker类的sal a r y方法不是抽象方法,并给我出了 一个没故意义的代码,这样就无法逼迫子类重定义这个salary方法。为了避免这种情况,需要将Worker类的salary方法定义为抽象方法,而将Worker 类定义为抽象类。其余规定不变,编译通过,正常运营测试类代码。实验报告规定将编程题源程序、运营结果,以及实验中碰到的问题和解决问题的方法,写在实验报告上。pa c k a ge f i rst;publ i c class Adva n c edW o rke r op r ivate S tr i ng n a me;private S t ring i d ;p r i v ate i n t ag e ;pri v a te i nt wor k i n gA g e;publ i c Ad v a ncedWorker () o p ubl i c A d v a nc e dWork e r (String name, St ring id, i nt ag e , i nt w o r ki n g Age) o t his . n ame= n ame:o th i s . i d=i d ;o t his . ag e =ag e ;o 9 thi s . work i ngAge=wo r k ingA g e;)opub 1 I c void s e tName ( S t r i n g name) this, nam e =nam e ;o)public St r in g g e tName () o return name;o)op u b li c void s etld (Strin g id) o o th i s . id=id;opubl i c String g e t I d () o o r etur n i d;)p ub 1 ic void s etAge (i n t age) th i s. age= age;o)opubl i c int g etAge () o r et u r n age;pu b lie voi d setw o r ki n gA g e (int workingAg e ) o this . worki n g Age= workin g Age:publi c i nt getWo r ki n gAge () or e turn w o r k in g Age;0)0 p u b 1 ic dou b 1 e sal a ry () 0 retu r n 10 0 00 + 100 * wo r k ingAg e ;)pack age fi r st;p ublic class Company(0/ p r i v at e 实例变量,涉及 name,以及 ad v a nc e dWorkers, no r mal Workers 两 个对象数组/ Mana ger对象数组作为示例,下面已经给出pr i v ate S trin g n a me;opriva t e Mana ger man a g ers;private A d v a ncedWorker advancedWo r kers;op r iv a t e Norina 1 W o rker n o rmalWork ers;。设计无参数构造器Compa n y () 两个有参数构造器(一个要对所有实例变量初始赋值,此外一个只需要对n ame赋值)clas s Aaa int i;o Aa a () i = - 1; o o Aaa (int a) i = a ; o Aaa (do u b 1 e d) thi s ( (int) d) ; o (2)c 1 as s Aa a i nt i;® Aaa() i =-1 ;A a a (in t a) i = a;Aa a (d o uble a ) int b =(i n t )a; t his(b); 是否犯错:是犯错因素(假如犯错):thi s放第一行c 1 as s Aaa int i :o o Aa a () i=-l;o Aaa (int a) i = a ; ° Aaa ( d o u b 1 e a ) this( (in t)a); o Compa n y (String n ame, M a n a ge r manage r s> Adva n cedWo r ker a dvanc e dw o rk e r s, Norm a 1W o rk e r n ormalWorker s ) 。/ /初始化代码o o t his. name =name;othis .manage rs = manag e rs;this.advancedWor k ers= a d v a n cedWork e r s;o o t his . n ormal W o rker s =norm a 1 W o r k e r s ;o&Comp a ny (S t rin g n a me) o this. name=nam e ;0 0)每个实例变量的g et和s e t方法0 0p ublic doub 1 e to t a 1 S a la r y () 记录经理们的工资总额:通过循环调用managers i 的$ a 1 a ry方法,然后累加o d o uble suml=0;for (i n t i = 0; i<m a n a g e r s .length; i +) o o s u ml= s u ml + m a na g ers i . sala r y ();)o/记录高级工们的工资总额:通过循环调用ad v ancedWo rkers i 的sal a ry方法,然 后累加o do u b 1 e sum 2 = 0;o for (int i=0; i<adva n ce d W o r k e r s . leng t h; i+) a o s u m2 = sum 2 +advancedWor k er s i . sal a ry ();0 0)o/记录普通工们的工资总额:通过循环调用n。rmalW o rkers i 的s a la r y方法,然后累加o adoub 1 e sum3 = 0;o of 0 r (in t i= 0 ; i <norm a IWo r k e r s . I eng t h; i + ) osum 3 = s um3+norm a 1 Worke r s i . s alary ();o 0返网上述三个工资总额的合计值。o o ore t ur n suml+sum2+ s um 3 ;o)pa c kage fi r s t ;p ub 1 i C cl a ss Manage r /定义 name, id, age, work i n g Ag e 等 p rivate 类型的实例变量/定义两个构造器,无参数构造器和有参数构造器pri v a t e String nam e ;op r iva t e S t ri n g id;opriv a t e int age;opr i v a t e int workingAge;opublic Manager。p ubl i c Manager (S t ri n g n ame, S tri n g id, i n t age, i n t wo r king Age) “补充对象初始化代码*/o 9 t his . name=n a me:this.id=id;。t his .age =age;othi S . worki n gA g e =working A g e;)/定义每个实例变量的P ublic类型的ge t和set方法。o opub 1 ic void setName (Strin g name)(th i s.name = name;09)0 &pub 1 i c S t r ing g etName ()(0 oretur n n a me;00)public vo i d s e t I d ( S t r i ng id) 0 this. id=id;Ipubl i c S tri n g g etl d () 0r e t u rn id;0)0 p u b 1 i c vo i d set A g e (int age) t his. age= age;o)publ i c in t g e tAge () 0return age;0op u b 1 i c vo i d se t WorkingA g e ( i nt workingAge) 0 0 t his . working A ge=w o rking A g e ;0pub 1 ic i n t ge t Work i n g A g e () o o oretu r n vz o r k in g Age:)opub 1 i c doubl e s a 1 ary () oor e tur n 202304-20 0 *wor k i n g Age; )pack age firs t ;pub 1 I c class N o rmalW o r k e r op r i v ate S tri n g name;op r ivate Str ing i d ;priva t e i nt a ge;private in t w o rki n gAg e ;opiiblic Norm a 1W 0 rker () pub 1 ic Norm a lWorker(S t r ing name, Strin g id,int age, i n t workin g Age)( o o this, n am e =nam e ;o this.id=i d ;o th i s .a g e=a g e ;o th i s. wo r k i ng A g e=wor k i ngAge;0 Ip ub 1 i c voi d setN a me (St r i ng n a m e ) o this, nam e = n ame;opu b li c String g etName ( ) o o r e turn nam e :opubli c voi d s e t I d ( S tring id) othis.id=id;0 )opubl i c Stri n g ge t I d () return id:o p u blic vo id setAge (int age) othi s .age=age;opubli c int getAge () o ret u rn age;p ub 1 i c void setW o r k i ngAge (int workingA g e) this . w O r kingA g e = wor k i n g Age;0 )public in t get Work i ng Age () ret u r n work i ng A g e;o p ublic doubl e sala r y ( ) o retu r n 8000 + 80 * vz o r kingAge;o)package f irst;public cla s s Te s topu b lie static v o id mai n (St r ing args) Man a g er ma n agers= n e w Manager 2;/下面示例两行代码手工创建Ma n age r对象,并分别对ma n ager s的两个元素赋值ma n ag e rs 0 = n e w Manager ("王一 ","001 " , 30, 10);mana g ers 1 = new Ma na ger (“张二","00 2 ”, 40, 15);oAd v ance d W o r ke r advancedW o rkers = new Advan c edW o r ke r 4 ;o a d va n c e dw o rkers 0 =ne w Adv a ncedw o r ker ("0", "0 ", 30, 10);a dvanc e dWo r ker s 1 =new Adva n cedW o rker ("lu, n 1 " , 3 0 , 10);oad v a n ce d Wo r k e r s 2 =new Adv ance d Worke r ( ” 2 ", " 2 ", 30,10);oa d v a n c e dWorke r s 3 =new Ad v a ncedWo r ker (n3H, H 330, 10);参考上述代码,创建Adva ncedW。r k er对象,并分别对a d vane e dWor k e rs的 4个元素赋值Nor malWor k er norm a 1 W o r k e r s = new N o rm a IWorker 8;n ormalWorkers 0 = new N o rma 1 Wo r ke r ("0 " f "0", 3 0,10);n 0 rma 1 W 0 rker s 1 =new Norma IWorker (Hlnz " 1 ”,3 0 , 10);n o rma 1 Worke r s 2 =new No r m a IWorker (H 2 , H2" > 30,10):norma iWork ers 3 =new No r malWork er ( 0 3", n 3 " z 30, 10);n ormalWor k er s 4 = n ew Normalwork e r ("4", "4 " ,30 , 10):n o rma 1 Wo r ke r s 5 = n ew N o rm a iWork e r ( " 5", "5",3 0 , 10);norma 1 W o rk e rs 6 =new Normalworker ("6", "6 ", 3 0 , 1 0);norma 1 W o rkers 7 =n e w Norm a 1 Wo r ker ( *' 7" f "I", 3 0, 1 0);/同上,手工创建Norm a iworke r对象,并分别对n o rmalWor k ers的8个元素赋 值/将上述三个员工对象作为参数传递到C o m p any对象内部。o Comp a ny c o mpan y = n ew C o m p a n y ("公司名字",managers, a dv a n c edW o rker s , norm a IWorkers );o S y st e m. O ut. p ri n 七 1 n (“公司年工资,总额:“+c 0 mp a ny. tot a ISa 1 ary ():/输出公司工资总额0 )p a ckag e s ec o nd;pu b 1 i c class A d va n c edW o rker e x tends Wo r ke r o publi c Advan c e d Wor k e r (String name, Strin g id, i nt age, int wor king Age) o s u p er (nam e , id» a g e, w o rkingA g e ); o p u bl i c AdvancedWork e r () public double salary() o r e t u rn 10000+1 0 0* get Wor ki n gAge ();pack a g e second;p u bli c cla s s C ompany/privat e实例变量,涉及nam c o p r ivate String name;P ri v ate Worker worke rs; /只需要定义1个超类类型的数组,不需要定 义多个子类对象数组/设计无参数构造器C o mpany () 。/两个仃参数构造器(一个要对所行实例变量初始赋值,此外一个只需要对name赋值)Company (S t r ing n ame, Worke r workers) / / 对最初设计的代码进 行简化 0 初始化代码 o othi S . n am e =name;o o th i s . w o r k ers=w o rkers;o Com p a n y ( S tring name) o o t h is. name = name;/ /每个实例变量的get和set方法o o p ublic double t o t a ISala r y () /对最初设计的代码进行简化 。记录员工的工资总额:通过循环调用workers i 的salar y方法,然后累加 o / /返回上述三个工资总额的合计值。o odou b 1 e sum=0;o o of 0 r ( i n t i= 0 : i<this .vz o r k ers . length; i+)o a i f (thi s . w o rk e rs i ! =null) o o°s um=s u m + th i s . wor k ers i . sa 1 ary ();e t u rn sum; pac k a g e s econ d ;public cl a s s Manager ext e nds Worker p u b 1 ic Man a ger ( S tring n ame» S t ring id, int ag e , in t wo r k i ngAge) os u per (name. id,age,work ingAg e );)o publi c M a nager () o p u b 1 i c dou b le salary () o re t u r n 2 0 2 3 0+200*g e t W o r k i n gAge ();o )package sec o n d ;p u blic class Normal Wo r k er e x t e n ds Worker o pub lie No r malWo r k e r (St r i n g n a me, S tri n g id» int age, in t workin g Ag e ) osu p er (name, id, a g e z w o rki n g A ge);0 o publ i c NormalWo r ker () o publ i c d ouble salary。o o re t urn 8000+80 *getWork i ngAge();)packa g e seco n d ; publ ice las s Tes t p u bli c stat i c vo i d main (St r ing args) Wor k er wor k ers = new Worke r 14 ; /员工数量共1 4 个/下面示例两行代码手工创建Manage r对象,并分另U对managers的两个元素赋值worker s 0 = new Manage r ("王一","001 " , 30, 10); 创建子类 Ma n ager 对象,井转型为超类wor k e rs 1 = n e w Mana g er (“张二“,”002 ”, 4 0,15);/含义同上o/ /参考上述