面向对象类继承与接口二实验报告.docx

上传人:b****0 文档编号:8935591 上传时间:2023-05-16 格式:DOCX 页数:32 大小:22.90KB
下载 相关 举报
面向对象类继承与接口二实验报告.docx_第1页
第1页 / 共32页
面向对象类继承与接口二实验报告.docx_第2页
第2页 / 共32页
面向对象类继承与接口二实验报告.docx_第3页
第3页 / 共32页
面向对象类继承与接口二实验报告.docx_第4页
第4页 / 共32页
面向对象类继承与接口二实验报告.docx_第5页
第5页 / 共32页
面向对象类继承与接口二实验报告.docx_第6页
第6页 / 共32页
面向对象类继承与接口二实验报告.docx_第7页
第7页 / 共32页
面向对象类继承与接口二实验报告.docx_第8页
第8页 / 共32页
面向对象类继承与接口二实验报告.docx_第9页
第9页 / 共32页
面向对象类继承与接口二实验报告.docx_第10页
第10页 / 共32页
面向对象类继承与接口二实验报告.docx_第11页
第11页 / 共32页
面向对象类继承与接口二实验报告.docx_第12页
第12页 / 共32页
面向对象类继承与接口二实验报告.docx_第13页
第13页 / 共32页
面向对象类继承与接口二实验报告.docx_第14页
第14页 / 共32页
面向对象类继承与接口二实验报告.docx_第15页
第15页 / 共32页
面向对象类继承与接口二实验报告.docx_第16页
第16页 / 共32页
面向对象类继承与接口二实验报告.docx_第17页
第17页 / 共32页
面向对象类继承与接口二实验报告.docx_第18页
第18页 / 共32页
面向对象类继承与接口二实验报告.docx_第19页
第19页 / 共32页
面向对象类继承与接口二实验报告.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

面向对象类继承与接口二实验报告.docx

《面向对象类继承与接口二实验报告.docx》由会员分享,可在线阅读,更多相关《面向对象类继承与接口二实验报告.docx(32页珍藏版)》请在冰点文库上搜索。

面向对象类继承与接口二实验报告.docx

面向对象类继承与接口二实验报告

实验十类继承与接口

(二)

课程名称:

面向对象程序设计

实验项目名称:

实验十类继承与接口

(二)

学生姓名:

专业:

学号:

实验地点:

实验日期:

年月

【实验目的】

1.掌握Java类的继承特点,包括子类声明、对象创建

2.掌握域的继承与隐藏的特点和用法

3.掌握方法的继承与重写的特点和用法

【实验内容】

一.改错题

检查下面代码是否有错,如果有错,写明错误原因,并修正错误。

(1)

classAaa{

inti;

Aaa(){i=-1;}

Aaa(inta){i=a;}

Aaa(doubled){Aaa((int)d);}

}

是否出错:

出错原因(如果出错):

构造器调用构造器不能直接用名

classAaa{

inti;

Aaa(){i=-1;}

Aaa(inta){i=a;}

Aaa(doubled){this((int)d);}

}

 

(2)

classAaa{

inti;

Aaa(){i=-1;}

Aaa(inta){i=a;}

Aaa(doublea){intb=(int)a;this(b);}

}

是否出错:

出错原因(如果出错):

this放第一行

classAaa{

inti;

Aaa(){i=-1;}

Aaa(inta){i=a;}

Aaa(doublea){this((int)a);}

}

 

(3)

classAaa{

inti;

Aaa(inta){i=a;}

}

classBbbextendsAaa{

Bbb(){}

}

是否出错:

出错原因(如果出错):

父类没有无参构造,子类中药通过super调用父类构造

classAaa{

inti;

Aaa(inta){i=a;}

}

classBbbextendsAaa{

Bbb(inta){

super(a);

}

}

 

(4)

classAaa{

privateinti;

protectedintj;

}

classBbbextendsAaa{

Bbb(){

i=10;

j=99;

}

}

是否出错:

出错原因(如果出错):

private只能在自己的类中使用

classAaa{

protectedinti;

protectedintj;

}

classBbbextendsAaa{

Bbb(){

i=10;

j=99;

}

}

 

(5)编译下面程序,程序是否出错

classA{

inti=100;

}

classBextendsA{

inti=10000;

publicstaticvoidmain(String[]args){

System.out.println(this.i);

System.out.println(super.i);

}

}

a)是否出错:

b)出错原因(如果出错):

不能在静态方法使用thissuper

classA{

inti=100;

}

classBextendsA{

inti=10000;

publicvoidmain(String[]args){

System.out.println(this.i);

System.out.println(super.i);

}

}

c)如果将上述类B的inti=10000改为staticinti=10000;类A的inti=100改为staticinti=100;

程序是否出错?

出错原因(如果出错):

不能在静态方法使用thissuper

classA{

inti=100;

}

classBextendsA{

inti=10000;

publicvoidmain(String[]args){

System.out.println(this.i);

System.out.println(super.i);

}

}

d)如果将类B的main方法改为

publicstaticvoidmain(String[]args){

Bb=newB();

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)

classAaa{

inti;

publicvoidAaa(inta){i=a;}

publicstaticvoidmain(String[]args){

Aaaa=newAaa(10);

}

}

是否出错:

出错原因(如果出错):

构造器没有返回

classAaa{

inti;

publicAaa(inta){i=a;}

publicstaticvoidmain(String[]args){

Aaaa=newAaa(10);

}

}

 

(7)

classAaa{

publicstaticvoidmain(String[]args){

int[][]a=newint[5][];

for(inti=0;i

for(intj=0;i

a[i][j]=(int)(100*Math.random());

System.out.println(a[i][j]);

}

}

}

是否出错:

出错原因(如果出错):

for(intj=0;i

classAaa{

publicstaticvoidmain(String[]args){

int[][]a=newint[5][5];

for(inti=0;i

for(intj=0;j

a[i][j]=(int)(100*Math.random());

System.out.println(a[i][j]);

}

}

}

 

(8)

classA{

intabc(inti){return1;}//方法1

intabc(intj){return2;}//方法2

intabc(inti,intj){return3;}//方法3

voidabc(inti){}//方法4

}

是否有错:

 

上面类A中定义的四个方法是否都是方法的重载,有没有重复定义的方法,如果有,那么哪几个方法是重复定义的?

方法1和方法2是重复定义

(9)

classA{

voidshow(){

System.out.println("A类的show()");

}

}

classBextendsA{

intshow(){

System.out.println("B类的show()");

}

publicstaticvoidmain(String[]args){

Bb=newB();

b.show();

}

}

上面程序中的方法覆盖是否出错:

出错原因(如果出错):

如果将类B中的方法show()改为:

intshow(intb){

System.out.println("B类的show()");

returnb;

}

程序是否出错?

不出错

 

二.程序分析设计题

下面各个设计要放在各自的包中。

1.最初设计

最初设计的所有类都放到first包中

(1)员工类的设计

假设公司有三种类型的员工:

经理(manager),高级工(advancedworker),普通工人(normalworker)。

先分别设计描述这三种类型工人的类,要求如下:

●三个类的名称分别为Manager,AdvancedWorker,NormalWorker;

●每个类都有name(姓名),id(工号),age(年龄),workingAge(工龄)等private类型的实例变量,而每个实例变量都有public类型的get和set方法。

●每个类都要定义构造器,包括无参数构造器和至少一个有参数构造器(用于对实例变量赋初值)

●每个类都要定义一个public型的salary方法,用于计算员工对象的每月薪水,并返回计算结果,工资计算逻辑是:

底薪+工龄工资。

比如,经理的底薪是20000,另外根据工龄每年加200元;高级工的底薪是10000元,另加每年100元的工龄工资;普通员工的底薪是8000,另加每年80元的工龄工资。

●其余功能可以自行考虑

publicclassManager{

//定义name,id,age,workingAge等private类型的实例变量

//定义两个构造器,无参数构造器和有参数构造器

publicManager(Stringname,Stringid,intage,intworkingAge){

/*补充对象初始化代码*/

}

//定义每个实例变量的public类型的get和set方法。

publicdoublesalary(){/*代码补充*/}

}

publicclassAdvancedWorker{

//类似Manager

}

publicclassNormalWorker{

//类似Manager

}

(2)公司类的设计

公司类用于描述公司,要求如下:

●类名:

Company

●设计公司的private实例变量有:

公司名称(name),三个员工对象数组(分别描述经理们、高级工们、普通员工们)等,针对这些实例变量分别提供get和set方法。

注意:

为了简化设计,这些员工对象数组的创建不在Company对象内部,而是通过有参数构造器或者set方法从Company对象外部赋值到Company对象内部。

●提供构造器:

包括无参数构造器、两个有参数构造器(一个要对所有实例变量初始赋值,另外一个只需要对name赋值)。

●设计实例方法totalSalary,计算返回所有员工的工资,即对三个员工对象数组分别循环累计汇总工资

●其余功能可以自行增加

publicclassCompany{

//private实例变量,包括name,以及advancedWorkers,normalWorkers两个对象数组

//Manager对象数组作为示例,下面已经给出

privateManager[]managers;

//设计无参数构造器

//两个有参数构造器(一个要对所有实例变量初始赋值,另外一个只需要对name赋值)

Company(Stringname,Manager[]managers,AdvancedWorker[]advancedWorkers,NormalWorker[]normalWorkers){

//初始化代码

}

//每个实例变量的get和set方法

publicdoubletotalSalary(){

//统计经理们的工资总额:

通过循环调用managers[i]的salary方法,然后累加

//统计高级工们的工资总额:

通过循环调用advancedWorkers[i]的salary方法,然后累加

//统计普通工们的工资总额:

通过循环调用normalWorkers[i]的salary方法,然后累加

//返回上述三个工资总额的合计值

}

(3)测试类

publicclassTest{

publicstaticvoidmain(String[]args){

Manager[]managers=newManager[2];

//下面示例两行代码手工创建Manager对象,并分别对managers的两个元素赋值

managers[0]=newManager(“王一”,”001”,30,10);

managers[1]=newManager(“张二”,”002”,40,15);

AdvancedWorker[]advancedWorkers=newAdvancedWorker[4];

//参考上述代码,创建AdvancedWorker对象,并分别对advancedWorkers的4个元素赋值

NormalWorkernormalWorkers=newNormalWorker[8];

//同上,手工创建NormalWorker对象,并分别对normalWorkers的8个元素赋值

//将上述三个员工对象作为参数传递到Company对象内部。

Companycompany=newCompany(“公司名字”,managers,advancedWorkers,normalWorkers);

System.out.println("公司年工资总额:

"+company.totalSalary());//输出公司工资总额

}

}

 

2.改进设计:

利用类的基础和上转型重新设计

现在对前面的最初设计进行改造。

本次所有类都放到second包中。

(1)设计员工类的继承结构

前面的最初设计中,一个主要的缺点就是代码重复,就是三种类型的员工类有许多重复的代码,这时可以通过设计继承结构,将这些重复代码放到超类中,缓解代码重复问题。

要求设计如下:

●设计一个Worker类,该类描述员工,作为经理(manager),高级工(advancedworker),普通工人(normalworker)的共同的超类。

●Worker类提供子类的公共功能,即将子类的重复代码或类似代码移到Worker类中。

比如,:

⏹Worker类需要定义name(姓名),id(工号),age(年龄),workingAge(工龄)等private类型的实例变量,而每个实例变量都有public类型的get和set方法。

⏹Worker类定义两个构造器,包括无参数构造器和一个有参数构造器(用于对四个实例变量赋初值)

⏹Worker类定义一个public型的salary方法,用于计算员工对象的每月薪水,具体代码在将来的子类中重定义(现在只需要返回0)。

●三个子类Manager、AdvancedWorker、NormalWorker从Worker类继承,要求:

⏹每个子类定义各自的构造器,要求同最初设计,注意通过构造器调用链重用超类构造器的代码(即通过super调用超类构造器)

⏹每个类都各自重定义Worker类的salary方法,用于计算员工对象的每月薪水,具体计算逻辑(与最初设计相同):

底薪+工龄工资。

比如,经理的底薪是20000,另外根据工龄每年加200元;高级工的底薪是10000元,另加每年100元的工龄工资;普通员工的底薪是8000,另加每年80元的工龄工资。

●其余功能可以自行考虑

publicclassWorker{

//定义name,id,age,workingAge等private类型的实例变量

//定义两个构造器,无参数构造器和有参数构造器

publicWorker(Stringname,Stringid,intage,intworkingAge){

/*补充对象初始化代码*/

}

//定义每个实例变量的public类型的get和set方法。

publicdoublesalary(){return0;}//具体的计算方法由子类重定义。

}

publicclassManagerextendsWorker{

publicManager(Stringname,Stringid,intage,intworkingAge){

/*补充对象初始化代码,调用抄类构造器的代码*/

}

publicManager(){

/*补充对象初始化代码*/

}

publicdoublesalary(){return0;}//根据经理的工资计算逻辑重定义方法。

}

//AdvancedWorker、NormalWorker两个类的代码与Manager类似

(2)重新设计公司类

在最初设计的Company类的基础上,将代码改造,要求如下:

●类名:

Company

●重新设计公司的实例变量,定义private实例变量:

公司名称(name),Worker对象数组(workers),此处与前面的设计不同,仅仅设计一个超类Worker对象数组,而不是定义三个不同的三个子类对象数组,然后针对这些实例变量分别提供get和set方法。

注意:

为了简化设计,这些员工对象数组的创建不在Company对象内部,而是通过有参数构造器或者set方法从Company对象外部赋值到Company对象内部。

●提供构造器:

包括无参数构造器、两个有参数构造器(一个要对所有实例变量初始赋值,另外一个只需要对name赋值)。

●设计实例方法totalSalary,计算返回所有员工的工资,即对workers对象数组循环累计汇总工资(此处与最初设计不同,不用对三个子类数组分别循环统计)

●其余功能可以自行增加

publicclassCompany{

//private实例变量,包括name

privateWorker[]workers;//只需要定义1个超类类型的数组,不需要定义多个子类对象数组

//设计无参数构造器

//两个有参数构造器(一个要对所有实例变量初始赋值,另外一个只需要对name赋值)

Company(Stringname,Worker[]workers){//对最初设计的代码进行简化

//初始化代码

}

//每个实例变量的get和set方法

publicdoubletotalSalary(){//对最初设计的代码进行简化

//统计员工的工资总额:

通过循环调用workers[i]的salary方法,然后累加

//返回上述三个工资总额的合计值

}

(3)改写测试类

在最初设计的Test类的基础上改写代码。

publicclassTest{

publicstaticvoidmain(String[]args){

Workerworkers=newWorker\[14];//员工数量共14个

//下面示例两行代码手工创建Manager对象,并分别对managers的两个元素赋值

workers[0]=newManager(“王一”,”001”,30,10);//创建子类Manager对象,并转型为超类

workers[1]=newManager(“张二”,”002”,40,15);//含义同上

//参考上述代码,用4行代码分别创建AdvancedWorker对象,并赋值给workers的元素

//参考上述代码,用8行代码分别创建NormalWorker对象,并赋值给workers的元素

//将上述三个员工对象作为参数传递到Company对象内部。

Companycompany=newCompany(“公司名字”,workers);

System.out.println("公司年工资总额:

"+company.totalSalary());//输出公司工资总额

}

}

 

3.改进设计:

将超类设计为抽象类

现在对前面的改进设计进行改造。

本次所有类都放到third包中。

前面设计的一个缺陷是:

超类Worker类的salary方法不是抽象方法,并给我出了一个没有意义的代码,这样就无法强迫子类重定义这个salary方法。

为了避免这种情况,需要将Worker类的salary方法定义为抽象方法,而将Worker类定义为抽象类。

其余要求不变,编译通过,正常运行测试类代码。

 

实验报告要求

将编程题源程序、运行结果,以及实验中遇到的问题和解决问题的方法,写在实验报告上。

packagefirst;

publicclassAdvancedWorker{

privateStringname;

privateStringid;

privateintage;

privateintworkingAge;

publicAdvancedWorker(){}

publicAdvancedWorker(Stringname,Stringid,intage,intworkingAge){

this.name=name;

this.id=id;

this.age=age;

this.workingAge=workingAge;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicStringgetName(){

returnname;

}

publicvoidsetId(Stringid){

this.id=id;

}

publicStringgetId(){

returnid;

}

publicvoidsetAge(intage){

this.age=age;

}

publicintgetAge(){

returnage;

}

publicvoidsetWorkingAge(intworkingAge){

this.workingAge=workingAge;

}

publicintgetWorkingAge(){

returnworkingAge;

}

publicdoublesalary(){

return10000+100*workingAge;

}

}

packagefirst;

publicclassCompany{

//private实例变量,包括name,以及advancedWorkers,normalWorkers两个对象数组

//Manager对象数组作为示例,下面已经给出

privateStringname;

privateManager[]manager

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2