收藏 分享(赏)

面向对象--类继承与接口(二)实验报告.doc

上传人:HR专家 文档编号:11533215 上传时间:2020-06-05 格式:DOC 页数:20 大小:84.50KB
下载 相关 举报
面向对象--类继承与接口(二)实验报告.doc_第1页
第1页 / 共20页
面向对象--类继承与接口(二)实验报告.doc_第2页
第2页 / 共20页
面向对象--类继承与接口(二)实验报告.doc_第3页
第3页 / 共20页
面向对象--类继承与接口(二)实验报告.doc_第4页
第4页 / 共20页
面向对象--类继承与接口(二)实验报告.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、实验十 类继承与接口(二) 课程名称: 面向对象程序设计 实验项目名称: 实验十 类继承与接口 (二) 学生姓名: 专业: 学号: 实验地点: 实验日期: 年 月 【实验目的】1掌握Java类的继承特点,包括子类声明、对象创建2. 掌握域的继承与隐藏的特点和用法3. 掌握方法的继承与重写的特点和用法【实验内容】一. 改错题 检查下面代码是否有错,如果有错,写明错误原因,并修正错误。(1) class Aaa int i; Aaa()i=-1; Aaa(int a) i = a; Aaa(double d)Aaa(int)d);是否出错:是出错原因(如果出错):构造器调用构造器不能直接用名cla

2、ss Aaa int i; Aaa()i=-1; Aaa(int a) i = a; Aaa(double d)this(int)d);(2) class Aaa int i; Aaa()i=-1; Aaa(int a) i = a; Aaa(double a)int b=(int)a;this(b); 是否出错:是出错原因(如果出错):this放第一行class Aaa int i; Aaa()i=-1; Aaa(int a) i = a; Aaa(double a)this(int)a);(3)class Aaa int i;Aaa(int a) i = a;class Bbb exten

3、ds Aaa Bbb() 是否出错:是出错原因(如果出错):父类没有无参构造,子类中药通过super调用父类构造class Aaa int i;Aaa(int a) i = a;class Bbb extends AaaBbb(int a) super(a);(4)class Aaa private int i; protected int j;class Bbb extends Aaa Bbb() i = 10; j = 99; 是否出错:是出错原因(如果出错):private只能在自己的类中使用class Aaaprotected int i; protected int j;class

4、Bbb extends Aaa Bbb() i = 10; j = 99; (5)编译下面程序,程序是否出错class A int i =100;class B extends A int i =10000;public static void main(String args)System.out.println(this.i);System.out.println(super.i);a) 是否出错:是b) 出错原因(如果出错):不能在静态方法使用this superclass A int i =100;class B extends A int i =10000;public void m

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

6、ut.println(super.i);d)如果将类B的main方法改为public static void main(String args) B b =new B();System.out.println(b.i); System.out.println(A)b.i); 程序是否出错? 是出错原因(如果出错):不能强制将in类型改为A如果没出错, 给出结果:上面的System.out.println(b.i)的含义: System.out.println(A)b.i) 的含义: (6)class Aaa int i; public void Aaa(int a) i=a; public s

7、tatic void main(String args) Aaa a = new Aaa(10); 是否出错:是出错原因(如果出错):构造器没有返回class Aaa int i; public Aaa(int a) i=a; public static void main(String args) Aaa a = new Aaa(10); (7)class 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

8、)(100*Math.random(); System.out.println(aij); 是否出错:出错原因(如果出错):for(int j=0;iai.length;j+)出现无限循环class Aaa public static void main(String args)int a=new int55; for( int i=0;ia.length;i+) for(int j=0;jai.length;j+) aij= (int)(100*Math.random(); System.out.println(aij); (8)class A int abc(int i)return 1;

9、 /方法1 int abc(int j)return 2; /方法2 int abc(int i,int j)return 3; /方法3 void abc(int i) /方法4是否有错: 是上面类A中定义的四个方法是否都是方法的重载,有没有重复定义的方法,如果有,那么哪几个方法是重复定义的?方法1和方法2是重复定义(9)class A void show() System.out.println(A类的show(); class B extends A int show() System.out.println(B类的show(); public static void main(Stri

10、ng args) B b = new B(); b.show(); 上面程序中的方法覆盖是否出错:是出错原因(如果出错):如果将类B中的方法show()改为: int show(int b)System.out.println(B类的show();return b; 程序是否出错? 不出错二. 程序分析设计题 下面各个设计要放在各自的包中。1. 最初设计 最初设计的所有类都放到first包中(1)员工类的设计假设公司有三种类型的员工:经理(manager),高级工(advanced worker),普通工人(normal worker)。先分别设计描述这三种类型工人的类,要求如下:l 三个类的

11、名称分别为Manager,AdvancedWorker,NormalWorker;l 每个类都有name(姓名),id(工号),age(年龄),workingAge(工龄)等private类型的实例变量,而每个实例变量都有public类型的get和set方法。l 每个类都要定义构造器,包括无参数构造器和至少一个有参数构造器(用于对实例变量赋初值)l 每个类都要定义一个public型的salary方法,用于计算员工对象的每月薪水,并返回计算结果,工资计算逻辑是:底薪+工龄工资。比如,经理的底薪是20000,另外根据工龄每年加200元;高级工的底薪是10000元,另加每年100元的工龄工资;普通员

12、工的底薪是8000,另加每年80元的工龄工资。l 其余功能可以自行考虑public class Manager /定义name,id,age,workingAge等private类型的实例变量 /定义两个构造器,无参数构造器和有参数构造器 public Manager(String name,String id,int age, int workingAge) /*补充对象初始化代码*/ /定义每个实例变量的public类型的get和set方法。 public double salary()/*代码补充*/public class AdvancedWorker /类似Managerpublic

13、 class NormalWorker /类似Manager(2)公司类的设计公司类用于描述公司,要求如下:l 类名:Companyl 设计公司的private实例变量有:公司名称(name),三个员工对象数组(分别描述经理们、高级工们、普通员工们)等,针对这些实例变量分别提供get和set方法。注意:为了简化设计,这些员工对象数组的创建不在Company对象内部,而是通过有参数构造器或者set方法从Company对象外部赋值到Company对象内部。l 提供构造器:包括无参数构造器、两个有参数构造器(一个要对所有实例变量初始赋值,另外一个只需要对name赋值)。l 设计实例方法totalSa

14、lary,计算返回所有员工的工资,即对三个员工对象数组分别循环累计汇总工资l 其余功能可以自行增加public class Company/private实例变量,包括name,以及advancedWorkers,normalWorkers两个对象数组/ Manager对象数组作为示例,下面已经给出private Manager managers;/设计无参数构造器/两个有参数构造器(一个要对所有实例变量初始赋值,另外一个只需要对name赋值)Company(String name,Manager managers, AdvancedWorker advancedWorkers, Normal

15、Worker normalWorkers)/初始化代码/每个实例变量的get和set方法public double totalSalary()/统计经理们的工资总额:通过循环调用managersi的salary方法,然后累加/统计高级工们的工资总额:通过循环调用advancedWorkersi的salary方法,然后累加/统计普通工们的工资总额:通过循环调用normalWorkersi的salary方法,然后累加/返回上述三个工资总额的合计值 (3)测试类public class Testpublic static void main(String args)Manager managers=

16、new Manager2; /下面示例两行代码手工创建Manager对象,并分别对managers的两个元素赋值 managers0 = new Manager(“王一”,”001”,30, 10); managers1 = new Manager(“张二”,”002”,40, 15);AdvancedWorker advancedWorkers = new AdvancedWorker4; /参考上述代码,创建AdvancedWorker对象,并分别对advancedWorkers 的4个元素赋值 NormalWorker normalWorkers = new NormalWorker 8

17、; /同上,手工创建NormalWorker 对象,并分别对normalWorkers 的8个元素赋值 /将上述三个员工对象作为参数传递到Company对象内部。 Company company=new Company(“公司名字”, managers,advancedWorkers,normalWorkers ); System.out.println(公司年工资总额:+company.totalSalary();/输出公司工资总额2. 改进设计:利用类的基础和上转型重新设计现在对前面的最初设计进行改造。本次所有类都放到second包中。(1)设计员工类的继承结构 前面的最初设计中,一个主要

18、的缺点就是代码重复,就是三种类型的员工类有许多重复的代码,这时可以通过设计继承结构,将这些重复代码放到超类中,缓解代码重复问题。要求设计如下:l 设计一个Worker类,该类描述员工,作为经理(manager),高级工(advanced worker),普通工人(normal worker)的共同的超类。l Worker类提供子类的公共功能,即将子类的重复代码或类似代码移到Worker类中。比如,:n Worker类需要定义name(姓名),id(工号),age(年龄),workingAge(工龄)等private类型的实例变量,而每个实例变量都有public类型的get和set方法。n Wo

19、rker类定义两个构造器,包括无参数构造器和一个有参数构造器(用于对四个实例变量赋初值)n Worker类定义一个public型的salary方法,用于计算员工对象的每月薪水,具体代码在将来的子类中重定义(现在只需要返回0)。l 三个子类Manager、AdvancedWorker、NormalWorker从Worker类继承,要求:n 每个子类定义各自的构造器,要求同最初设计,注意通过构造器调用链重用超类构造器的代码(即通过super调用超类构造器)n 每个类都各自重定义Worker类的salary方法,用于计算员工对象的每月薪水,具体计算逻辑(与最初设计相同):底薪+工龄工资。比如,经理的

20、底薪是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) /*补充对象初始化代码*/ /定义每个实例变量的public类型的get和set方法。 public double salary()

21、return 0; /具体的计算方法由子类重定义。public class Manager extends Worker public Manager (String name,String id,int age, int workingAge) /*补充对象初始化代码,调用抄类构造器的代码*/ public Manager () /*补充对象初始化代码*/ public double salary()return 0; /根据经理的工资计算逻辑重定义方法。/AdvancedWorker、NormalWorker两个类的代码与Manager类似(2)重新设计公司类在最初设计的Company类的

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

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

24、ublic 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(“王一”,”001”,30, 10

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

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

27、ing name;private String id;private int age;private int workingAge;public AdvancedWorker()public AdvancedWorker(String name,String id,int age,int workingAge)this.name=name;this.id=id;this.age=age;this.workingAge=workingAge;public void setName(String name)this.name=name;public String getName()return n

28、ame;public void setId(String id)this.id=id;public String getId()return id;public void setAge(int age)this.age=age;public int getAge()return age;public void setWorkingAge(int workingAge)this.workingAge=workingAge;public int getWorkingAge()return workingAge;public double salary()return 10000+100*worki

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

30、mpany(String name,Manager managers, AdvancedWorker advancedWorkers, NormalWorker normalWorkers)/初始化代码this.name=name;this.managers=managers;this.advancedWorkers=advancedWorkers;this.normalWorkers=normalWorkers;Company(String name)this.name=name;/每个实例变量的get和set方法public double totalSalary()/统计经理们的工资总额:

31、通过循环调用managersi的salary方法,然后累加double sum1=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

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

33、() public Manager(String name,String id,int age, int workingAge) /*补充对象初始化代码*/ this.name=name;this.id=id;this.age=age;this.workingAge=workingAge; /定义每个实例变量的public类型的get和set方法。 public void setName(String name)this.name=name;public String getName()return name;public void setId(String id)this.id=id;pub

34、lic String getId()return id;public void setAge(int age)this.age=age;public int getAge()return age;public void setWorkingAge(int workingAge)this.workingAge=workingAge;public int getWorkingAge()return workingAge; public double salary() return 20000+200*workingAge;package first;public class NormalWorke

35、r private String name;private String id;private int age;private int workingAge;public NormalWorker()public NormalWorker(String name,String id,int age,int workingAge)this.name=name;this.id=id;this.age=age;this.workingAge=workingAge;public void setName(String name)this.name=name;public String getName(

36、)return name;public void setId(String id)this.id=id;public String getId()return id;public void setAge(int age)this.age=age;public int getAge()return age;public void setWorkingAge(int workingAge)this.workingAge=workingAge;public int getWorkingAge()return workingAge;public double salary()return 8000+8

37、0*workingAge;package first;public class Testpublic static void main(String args)Manager managers=new Manager2; /下面示例两行代码手工创建Manager对象,并分别对managers的两个元素赋值 managers0 = new Manager(王一,001,30, 10); managers1 = new Manager(张二,002,40, 15);AdvancedWorker advancedWorkers = new AdvancedWorker4; advancedWorke

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

39、rmalWorker(0,0,30,10); normalWorkers1=new NormalWorker(1,1,30,10); normalWorkers2=new 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); normalWorkers

40、7=new NormalWorker(7,7,30,10); /同上,手工创建NormalWorker 对象,并分别对normalWorkers 的8个元素赋值 /将上述三个员工对象作为参数传递到Company对象内部。 Company company=new Company(公司名字, managers,advancedWorkers,normalWorkers ); System.out.println(公司年工资总额:+company.totalSalary();/输出公司工资总额 package second;public class AdvancedWorker extends Worker public AdvancedWorker(String name,String id,int age, int workingAge)super(name,id,age,workingAge); public AdvancedWorker() public double salary() return 10000+100*getWorkingAge(); package second;publi

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

当前位置:首页 > 实用文档 > 工作总结

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报