面向对象-类继承与接口二某实验报告材料.doc

上传人:李司机 文档编号:1135921 上传时间:2022-07-01 格式:DOC 页数:20 大小:162KB
返回 下载 相关 举报
面向对象-类继承与接口二某实验报告材料.doc_第1页
第1页 / 共20页
面向对象-类继承与接口二某实验报告材料.doc_第2页
第2页 / 共20页
面向对象-类继承与接口二某实验报告材料.doc_第3页
第3页 / 共20页
面向对象-类继承与接口二某实验报告材料.doc_第4页
第4页 / 共20页
面向对象-类继承与接口二某实验报告材料.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《面向对象-类继承与接口二某实验报告材料.doc》由会员分享,可在线阅读,更多相关《面向对象-类继承与接口二某实验报告材料.doc(20页珍藏版)》请在三一办公上搜索。

1、word【实验目的】1掌握Java类的继承特点,包括子类声明、对象创建2. 掌握域的继承与隐藏的特点和用法3. 掌握方法的继承与重写的特点和用法【实验内容】一. 改错题检查下面代码是否有错,如果有错,写明错误原因,并修正错误。1 class Aaa int i; Aaa()i=-1; Aaa(int a) i = a; Aaa(double d)Aaa(int)d);是否出错:是出错原因如果出错:构造器调用构造器不能直接用名class Aaainti; Aaa()i=-1; Aaa(int a) i = a; Aaa(double d)this(int)d);2 class Aaa int i

2、; Aaa()i=-1; Aaa(int a) i = a; Aaa(double a)int b=(int)a;this(b);是否出错:是出错原因如果出错:this放第一行class Aaainti; Aaa()i=-1; Aaa(int a) i = a; Aaa(double a)this(int)a);3class Aaa int i;Aaa(int a) i = a;class Bbb extends Aaa Bbb() 是否出错:是出错原因如果出错:父类没有无参构造,子类中药通过super调用父类构造class Aaainti;Aaa(int a) i = a;class Bbb

3、 extends AaaBbb(int a) super(a);4class Aaa private int i; protected int j;class Bbb extends Aaa Bbb()i = 10;j = 99; 是否出错:是出错原因如果出错:private只能在自己的类中使用class Aaaprotectedinti;protectedintj;class Bbb extends Aaa Bbb()i = 10;j = 99; 5编译下面程序,程序是否出错class A int i =100;class B extends A int i =10000;public st

4、atic void main(String args)System.out.println(this.i);System.out.println(super.i);a) 是否出错:是b) 出错原因如果出错:不能在静态方法使用this superclass Ainti =100;class B extends Ainti =10000;publicvoid main(String args)System.out.println(this.i);System.out.println(super.i);c)如果将上述类B的int i =10000改为static int i =10000;类A的in

5、t i =100改为static int i =100;程序是否出错?是出错原因如果出错:不能在静态方法使用this superclass Ainti =100;class B extends Ainti =10000;publicvoid main(String args)System.out.println(this.i);System.out.println(super.i);d)如果将类B的main方法改为public static void main(String args) B b =new B();System.out.println(b.i); System.out.print

6、ln(A)b.i); 程序是否出错? 是出错原因如果出错:不能强制将in类型改为A如果没出错, 给出结果:上面的System.out.println(b.i)的含义: System.out.println(A)b.i) 的含义: 6class Aaa int i; public void Aaa(int a) i=a; public static void main(String args) Aaa a = new Aaa(10); 是否出错:是出错原因如果出错:构造器没有返回class Aaainti;public Aaa(int a) i=a;publicstaticvoid main(S

7、tring args) Aaa a = new Aaa(10); 7class Aaa public static void main(String args)int a=new int5; for( int i=0;ia.length;i+) for(int j=0;iai.length;j+) aij= (int)(100*Math.random(); System.out.println(aij); 是否出错:出错原因如果出错:for(int j=0;iai.length;j+)出现无限循环class Aaapublicstaticvoid main(String args)int a=

8、newint55;for( int i=0;ia.length;i+)for(intj=0;jai.length;j+) aij= (int)(100*Math.random(); System.out.println(aij); 8class A int abc(int i)return 1; /方法1 int abc(int j)return 2; /方法2 int abc(int i,int j)return 3; /方法3 void abc(int i) /方法4是否有错: 是上面类A中定义的四个方法是否都是方法的重载,有没有重复定义的方法,如果有,那么哪几个方法是重复定义的?方法1和

9、方法2是重复定义9class A void show() System.out.println(A类的show(); class B extends A int show() System.out.println(B类的show(); public static void main(String args)B b = new B();b.show(); 上面程序中的方法覆盖是否出错:是出错原因如果出错:如果将类B中的方法show()改为: int show(int b)System.out.println(B类的show();return b; 程序是否出错? 不出错二. 程序分析设计题下面各

10、个设计要放在各自的包中。1. 最初设计 最初设计的所有类都放到first包中1员工类的设计假设公司有三种类型的员工:经理manager,高级工advanced worker,普通工人normal worker。先分别设计描述这三种类型工人的类,要求如下:l 三个类的名称分别为Manager,AdvancedWorker,NormalWorker;l 每个类都有name某某,id工号,age年龄,workingAge工龄等private类型的实例变量,而每个实例变量都有public类型的get和set方法。l 每个类都要定义构造器,包括无参数构造器和至少一个有参数构造器用于对实例变量赋初值l 每

11、个类都要定义一个public型的salary方法,用于计算员工对象的每月薪水,并返回计算结果,工资计算逻辑是:底薪+工龄工资。比如,经理的底薪是20000,另外根据工龄每年加200元;高级工的底薪是10000元,另加每年100元的工龄工资;普通员工的底薪是8000,另加每年80元的工龄工资。l 其余功能可以自行考虑public class Manager /定义name,id,age,workingAge等private类型的实例变量/定义两个构造器,无参数构造器和有参数构造器 public Manager(String name,String id,int age, int workingA

12、ge) /*补充对象初始化代码*/ /定义每个实例变量的public类型的get和set方法。 public double salary()/*代码补充*/public class AdvancedWorker /类似Managerpublic class NormalWorker /类似Manager2公司类的设计公司类用于描述公司,要求如下:l 类名:panyl 设计公司的private实例变量有:公司名称name,三个员工对象数组分别描述经理们、高级工们、普通员工们等,针对这些实例变量分别提供get和set方法。注意:为了简化设计,这些员工对象数组的创建不在pany对象内部,而是通过有参

13、数构造器或者set方法从pany对象外部赋值到pany对象内部。l 提供构造器:包括无参数构造器、两个有参数构造器(一个要对所有实例变量初始赋值,另外一个只需要对name赋值)。l 设计实例方法totalSalary,计算返回所有员工的工资,即对三个员工对象数组分别循环累计汇总工资l 其余功能可以自行增加public class pany/private实例变量,包括name,以与advancedWorkers,normalWorkers两个对象数组/ Manager对象数组作为示例,下面已经给出private Manager managers;/设计无参数构造器/两个有参数构造器(一个要对所

14、有实例变量初始赋值,另外一个只需要对name赋值)pany(String name,Manager managers, AdvancedWorker advancedWorkers, NormalWorker normalWorkers)/初始化代码/每个实例变量的get和set方法public double totalSalary()/统计经理们的工资总额:通过循环调用managersi的salary方法,然后累加/统计高级工们的工资总额:通过循环调用advancedWorkersi的salary方法,然后累加/统计普通工们的工资总额:通过循环调用normalWorkersi的salary方

15、法,然后累加/返回上述三个工资总额的合计值 3测试类public class Testpublic static void main(String args)Manager managers=new Manager2; /下面示例两行代码手工创建Manager对象,并分别对managers的两个元素赋值 managers0 = new Manager(“王一,001,30, 10); managers1 = new Manager(“X二,002,40, 15);AdvancedWorker advancedWorkers = new AdvancedWorker4; /参考上述代码,创建Ad

16、vancedWorker对象,并分别对advancedWorkers 的4个元素赋值 NormalWorker normalWorkers = new NormalWorker 8; /同上,手工创建NormalWorker 对象,并分别对normalWorkers 的8个元素赋值/将上述三个员工对象作为参数传递到pany对象内部。pany pany=new pany(“公司名字, managers,advancedWorkers,normalWorkers );System.out.println(公司年工资总额:+pany.totalSalary();/输出公司工资总额2. 改良设计:利用

17、类的根底和上转型重新设计现在对前面的最初设计进展改造。本次所有类都放到second包中。1设计员工类的继承结构 前面的最初设计中,一个主要的缺点就是代码重复,就是三种类型的员工类有许多重复的代码,这时可以通过设计继承结构,将这些重复代码放到超类中,缓解代码重复问题。要求设计如下:l 设计一个Worker类,该类描述员工,作为经理manager,高级工advanced worker,普通工人normal worker的共同的超类。l Worker类提供子类的公共功能,即将子类的重复代码或类似代码移到Worker类中。比如,:n Worker类需要定义name某某,id工号,age年龄,worki

18、ngAge工龄等private类型的实例变量,而每个实例变量都有public类型的get和set方法。n Worker类定义两个构造器,包括无参数构造器和一个有参数构造器用于对四个实例变量赋初值n Worker类定义一个public型的salary方法,用于计算员工对象的每月薪水,具体代码在将来的子类中重定义现在只需要返回0。l 三个子类Manager、AdvancedWorker、NormalWorker从Worker类继承,要求:n 每个子类定义各自的构造器,要求同最初设计,注意通过构造器调用链重用超类构造器的代码即通过super调用超类构造器n 每个类都各自重定义Worker类的sala

19、ry方法,用于计算员工对象的每月薪水,具体计算逻辑与最初设计一样:底薪+工龄工资。比如,经理的底薪是20000,另外根据工龄每年加200元;高级工的底薪是10000元,另加每年100元的工龄工资;普通员工的底薪是8000,另加每年80元的工龄工资。l 其余功能可以自行考虑public class Worker /定义name,id,age,workingAge等private类型的实例变量/定义两个构造器,无参数构造器和有参数构造器 public Worker(String name,String id,int age, int workingAge) /*补充对象初始化代码*/ /定义每个实

20、例变量的public类型的get和set方法。 public double salary()return 0; /具体的计算方法由子类重定义。public class Manager extends Workerpublic Manager (String name,String id,int age, int workingAge) /*补充对象初始化代码,调用抄类构造器的代码*/ public Manager () /*补充对象初始化代码*/ public double salary()return 0; /根据经理的工资计算逻辑重定义方法。/AdvancedWorker、NormalWo

21、rker两个类的代码与Manager类似2重新设计公司类在最初设计的pany类的根底上,将代码改造,要求如下:l 类名:panyl 重新设计公司的实例变量,定义private实例变量:公司名称name,Worker对象数组workers,此处与前面的设计不同,仅仅设计一个超类Worker对象数组,而不是定义三个不同的三个子类对象数组,然后针对这些实例变量分别提供get和set方法。注意:为了简化设计,这些员工对象数组的创建不在pany对象内部,而是通过有参数构造器或者set方法从pany对象外部赋值到pany对象内部。l 提供构造器:包括无参数构造器、两个有参数构造器(一个要对所有实例变量初始

22、赋值,另外一个只需要对name赋值)。l 设计实例方法totalSalary,计算返回所有员工的工资,即对workers对象数组循环累计汇总工资此处与最初设计不同,不用对三个子类数组分别循环统计l 其余功能可以自行增加public class pany/private实例变量,包括nameprivate Worker workers; /只需要定义1个超类类型的数组,不需要定义多个子类对象数组/设计无参数构造器/两个有参数构造器(一个要对所有实例变量初始赋值,另外一个只需要对name赋值)pany(String name,Worker workers)/对最初设计的代码进展简化/初始化代码/每

23、个实例变量的get和set方法public double totalSalary()/对最初设计的代码进展简化/统计员工的工资总额:通过循环调用workersi的salary方法,然后累加/返回上述三个工资总额的合计值 3改写测试类 在最初设计的Test类的根底上改写代码。public class Testpublic static void main(String args) Worker workers = new Worker14;/员工数量共14个 /下面示例两行代码手工创建Manager对象,并分别对managers的两个元素赋值 workers 0= new Manager(“王一

24、,001,30, 10);/创建子类Manager对象,并转型为超类 workers 1 = new Manager(“X二,002,40, 15);/含义同上 /参考上述代码,用4行代码分别创建AdvancedWorker对象,并赋值给workers的元素 /参考上述代码,用8行代码分别创建NormalWorker对象,并赋值给workers的元素/将上述三个员工对象作为参数传递到pany对象内部。pany pany=new pany(“公司名字, workers );System.out.println(公司年工资总额:+pany.totalSalary();/输出公司工资总额3. 改良设

25、计:将超类设计为抽象类现在对前面的改良设计进展改造。本次所有类都放到third包中。前面设计的一个缺陷是:超类Worker类的salary方法不是抽象方法,并给我出了一个没有意义的代码,这样就无法强迫子类重定义这个salary方法。为了防止这种情况,需要将Worker类的salary方法定义为抽象方法,而将Worker类定义为抽象类。其余要求不变,编译通过,正常运行测试类代码。实验报告要求将编程题源程序、运行结果,以与实验中遇到的问题和解决问题的方法,写在实验报告上。package first;publicclass AdvancedWorker private String name;pri

26、vate String id;privateintage;privateintworkingAge;public AdvancedWorker()public AdvancedWorker(String name,String id,int age,int workingAge)this.name=name;this.id=id;this.age=age;this.workingAge=workingAge;publicvoid setName(String name)this.name=name;public String getName()returnname;publicvoid set

27、Id(String id)this.id=id;public String getId()returnid;publicvoid setAge(int age)this.age=age;publicint getAge()returnage;publicvoid setWorkingAge(int workingAge)this.workingAge=workingAge;publicint getWorkingAge()returnworkingAge;publicdouble salary()return 10000+100*workingAge;package first;publicc

28、lass pany/private实例变量,包括name,以与advancedWorkers,normalWorkers两个对象数组/ Manager对象数组作为示例,下面已经给出private String name;private Manager managers;private AdvancedWorker advancedWorkers;private NormalWorker normalWorkers;/设计无参数构造器pany()/两个有参数构造器(一个要对所有实例变量初始赋值,另外一个只需要对name赋值)pany(String name,Manager managers, A

29、dvancedWorker advancedWorkers, NormalWorker normalWorkers)/初始化代码this.name=name;this.managers=managers;this.advancedWorkers=advancedWorkers;this.normalWorkers=normalWorkers;pany(String name)this.name=name;/每个实例变量的get和set方法publicdouble totalSalary()/统计经理们的工资总额:通过循环调用managersi的salary方法,然后累加double sum1=

30、0;for(int i=0;imanagers.length;i+)sum1=sum1+managersi.salary();/统计高级工们的工资总额:通过循环调用advancedWorkersi的salary方法,然后累加double sum2=0;for(int i=0;iadvancedWorkers.length;i+)sum2=sum2+advancedWorkersi.salary();/统计普通工们的工资总额:通过循环调用normalWorkersi的salary方法,然后累加double sum3=0;for(int i=0;inormalWorkers.length;i+)s

31、um3=sum3+normalWorkersi.salary();/返回上述三个工资总额的合计值return sum1+sum2+sum3;package first;publicclass Manager/定义name,id,age,workingAge等private类型的实例变量/定义两个构造器,无参数构造器和有参数构造器private String name;private String id;privateintage;privateintworkingAge;public Manager()public Manager(String name,String id,int age,

32、int workingAge)/*补充对象初始化代码*/this.name=name;this.id=id;this.age=age;this.workingAge=workingAge; /定义每个实例变量的public类型的get和set方法。 publicvoid setName(String name)this.name=name;public String getName()returnname;publicvoid setId(String id)this.id=id;public String getId()returnid;publicvoid setAge(int age)t

33、his.age=age;publicint getAge()returnage;publicvoid setWorkingAge(int workingAge)this.workingAge=workingAge;publicint getWorkingAge()returnworkingAge;publicdouble salary()return 20000+200*workingAge;package first;publicclassNormalWorker private String name;private String id;privateintage;privateintwo

34、rkingAge;public NormalWorker()public NormalWorker(String name,String id,int age,int workingAge)this.name=name;this.id=id;this.age=age;this.workingAge=workingAge;publicvoid setName(String name)this.name=name;public String getName()returnname;publicvoid setId(String id)this.id=id;public String getId()

35、returnid;publicvoid setAge(int age)this.age=age;publicint getAge()returnage;publicvoid setWorkingAge(int workingAge)this.workingAge=workingAge;publicint getWorkingAge()returnworkingAge;publicdouble salary()return 8000+80*workingAge;package first;publicclass Testpublicstaticvoid main(String args)Mana

36、ger managers=new Manager2;/下面示例两行代码手工创建Manager对象,并分别对managers的两个元素赋值 managers0 = new Manager(王一,001,30, 10); managers1 = new Manager(X二,002,40, 15);AdvancedWorker advancedWorkers = new AdvancedWorker4; advancedWorkers0=new AdvancedWorker(0,0,30,10);advancedWorkers1=new AdvancedWorker(1,1,30,10);adva

37、ncedWorkers2=new AdvancedWorker(2,2,30,10);advancedWorkers3=new AdvancedWorker(3,3,30,10);/参考上述代码,创建AdvancedWorker对象,并分别对advancedWorkers 的4个元素赋值 NormalWorker normalWorkers = new NormalWorker8; normalWorkers0=new NormalWorker(0,0,30,10); normalWorkers1=new NormalWorker(1,1,30,10); normalWorkers2=new

38、NormalWorker(2,2,30,10); normalWorkers3=new NormalWorker(3,3,30,10); normalWorkers4=new NormalWorker(4,4,30,10); normalWorkers5=new NormalWorker(5,5,30,10); normalWorkers6=new NormalWorker(6,6,30,10); normalWorkers7=new NormalWorker(7,7,30,10);/同上,手工创建NormalWorker 对象,并分别对normalWorkers 的8个元素赋值/将上述三个员

39、工对象作为参数传递到pany对象内部。 pany pany=new pany(公司名字, managers,advancedWorkers,normalWorkers );System.out.println(公司年工资总额:+pany.totalSalary();/输出公司工资总额package second;publicclass AdvancedWorker extends Worker public AdvancedWorker(String name,String id,int age, int workingAge)super(name,id,age,workingAge); pu

40、blic AdvancedWorker()publicdouble salary()return 10000+100*getWorkingAge(); package second;publicclass pany/private实例变量,包括nameprivate String name;private Worker workers; /只需要定义1个超类类型的数组,不需要定义多个子类对象数组/设计无参数构造器pany()/两个有参数构造器(一个要对所有实例变量初始赋值,另外一个只需要对name赋值)pany(String name,Worker workers)/对最初设计的代码进展简化/

41、初始化代码this.name=name;this.workers=workers;pany(String name)this.name=name;/每个实例变量的get和set方法publicdouble totalSalary()/对最初设计的代码进展简化/统计员工的工资总额:通过循环调用workersi的salary方法,然后累加/返回上述三个工资总额的合计值double sum=0;for(int i=0;ithis.workers.length;i+)if(this.workersi!=null)sum=sum+this.workersi.salary();return sum;pac

42、kage second;publicclass Manager extends Worker public Manager(String name,String id,int age, int workingAge)super(name,id,age,workingAge); public Manager()publicdouble salary()return 20000+200*getWorkingAge(); package second;publicclass NormalWorker extends Worker public NormalWorker(String name,String id,int

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号