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[]managers;
privateAdvancedWo