一. 填空题(共4题,100分)
1. (填空题)
protected成员的继承和使用
在上机实验6第二题的基础上修改源程序,具体要求如下:
Father类保持不变,即创建一个Father类,Father类放在名字叫ft的包中,Father类中一个protected void speak()方法,该方法输出"我是父亲"的消息。
然后从Father类继承产生Son类, Son类放在名字叫sn的包中,在Son类中定义一个protected void sing()方法,该方法输出"儿子正在唱歌"的消息。
最后定义一个主类Test,主类Test也放在ft包中,在主类Test中用Son类创建一个对象son,分别用三个源文件保存Father类, Son类和Test类。(注意:该程序在JDK中编译及执行)
回答以下问题:
(1) 在主类Test中通过对象son调用speak()方法是否能够成功_____________(回答是或者否)?
(2) 在主类Test中通过对象son调用sing()方法是否能够成功_____________(回答是或者否)?
(3) 如果需要在主类Test中通过对象son既可以调用speak()方法,又可以调用sing()方法,则需要将Son放在_____________包中。
(1) 是
(2) 否
(3) ft
2. (填空题)
子类的继承
编写一个Java应用程序,模拟中国人、美国人是人,北京人是中国人。
具体要求如下:
该程序有5个源文件:People.java,ChinaPeople.java,AmericanPeople.java,BeijingPeople.java,主类Example.java。请把【代码1】至【代码9】的语句补充完整。(注意:该程序在eclipse中编译及执行)
程序模板如下:
People.java
----------------------------------------
public class People {
protected double weight,height;
public void speakHello() {
System.out.println("yayayaya");
}
public void averageHeight() {
height=173;
System.out.println("average height:"+height);
}
public void averageWeight() {
weight=70;
System.out.println("average weight:"+weight);
}
}
ChinaPeople.java
----------------------------------------
public class ChinaPeople extends People {
public void speakHello() {
System.out.println("您好");
}
public void averageHeight() {
height = 168.78;
System.out.println("中国人的平均身高:"+height+" 厘米");
}
【代码1】 //重写public void averageWeight()方法,输出:"中国人的平均体重:65 公斤"
weight=【代码2】;
System.out.println("中国人的平均体重:"+weight+" 公斤");
}
public void chinaGongfu() {
System.out.println("坐如钟,站如松,睡如弓");
}
}
AmericanPeople.java
----------------------------------------
public class AmericanPeople extends People {
public void speakHello() { //重写public void speakHello()方法
【代码3】 //输出"How do you do"
}
【代码4】 //重写public void averageHeight()方法,输出"American's average height:176 cm"
height = 【代码5】 ;
System.out.println("American's average height:"+height+" cm");
}
public void averageWeight() {
weight = 75;
System.out.println("American's average weight:"+weight+" kg");
}
public void americanBoxing() {
System.out.println("直拳、钩拳、组合拳");
}
}
BeijingPeople.java
----------------------------------------
public class BeijingPeople extends ChinaPeople {
【代码6】 //重写public void averageHeight()方法,输出:"北京人的平均身高: 172.5厘米"
height = 【代码7】 ;
System.out.println("北京人的平均身高:"+height+" 厘米");
}
【代码8】 //重写public void averageWeight()方法,输出:"北京人的平均体重:70公斤"
weight= 【代码9】 ;
System.out.println("北京人的平均体重:"+weight+" 公斤");
}
public void beijingOpera() {
System.out.println("花脸、青衣、花旦和老生");
}
}
Example.java
----------------------------------------
public class Example {
public static void main(String args[]) {
ChinaPeople chinaPeople=new ChinaPeople();
AmericanPeople americanPeople=new AmericanPeople();
BeijingPeople beijingPeople=new BeijingPeople();
chinaPeople.speakHello();
americanPeople.speakHello();
beijingPeople.speakHello();
chinaPeople.averageHeight();
americanPeople.averageHeight();
beijingPeople.averageHeight();
chinaPeople.averageWeight();
americanPeople.averageWeight();
beijingPeople.averageWeight();
chinaPeople.chinaGongfu();
americanPeople.americanBoxing();
beijingPeople.beijingOpera() ;
beijingPeople.chinaGongfu();
}
}
回答以下问题:
(1)People 类中的
public void speakHello()
public void averageHeight()
public void averageWeight()
三个方法的方法体中的语句是否可以省略_____________(回答是或者否)?
(1) public void averageWeight() {
(2) 65
(3) System.out.println("How do you do");
(4) public void averageHeight() {
(5) 176
(6) public void averageHeight() {
(7) 172.5
(8) public void averageWeight() {
(9) 70
(10) 是
3. (填空题)
super关键字的用法
编写一个Java应用程序,模拟银行计算利息。
具体要求如下:
该程序有3个源文件:Bank.java,ConstructionBank.java,主类SaveMoney.java。请把【代码1】的语句补充完整。(注意:该程序在eclipse中编译及执行)
程序模板如下:
Bank.java
----------------------------------------
public class Bank {
int savedMoney;
int year;
double interest;
double interestRate = 0.029;
public double computerInterest() {
interest=year*interestRate*savedMoney;
return interest;
}
public void setInterestRate(double rate) {
interestRate = rate;
}
}
ConstructionBank.java
----------------------------------------
public class ConstructionBank extends Bank {
double year;
public double computerInterest() {
super.year=(int)year;
double r = year-(int)year;
int day=(int)(r*1000);
double yearInterest = 【代码1】 //super调用隐藏的computerInterest()方法
double dayInterest = day*0.0001*savedMoney;
interest= yearInterest+dayInterest;
System.out.printf("%d元存在建设银行%d年零%d天的利息:%f元\n",
savedMoney,super.year,day,interest);
return interest;
}
}
回答以下问题:
(1)根据提供的程序代码描述建设银行计算利息的方式:建设银行是按按年利率_________%,日利率_________%来计算利息。
(2)把SaveMoney.java中的【代码2】至【代码5】的语句补充完整,计算按年利率3.5%,8000元存在建设银行8年零236天的利息。
SaveMoney.java
----------------------------------------
public class SaveMoney {
public static void main(String args[]) {
ConstructionBank constructionBank=new ConstructionBank();
【代码2】//调用方法设置年利率3.5%
【代码3】 //设置存款为8000元
【代码4】//设置存款时间为8年零236天
【代码5】//计算利息
}
}
(1) super.computerInterest();
(2) 2.9
(3) 0.01
(4) constructionBank.setInterestRate(0.035);
(5) constructionBank.savedMoney=8000;
(6) constructionBank.year=8.236;
(7)
constructionBank.computerInterest();
4. (填空题)
上转型对象的使用
编写一个Java应用程序,模拟计算一个公司一年应支付给雇员的薪水总额。
具体要求如下:
一个公司里有三种雇员,YearWorker(按年领取薪水,一年50000元),MonthWorker(按月领取薪水,每月2300元,每年薪水总额27600元),WeekWorker(按周领取薪水,每年薪水总额38000元),请把【代码1】至【代码4】的语句补充完整。(注意:该程序在eclipse中编译及执行)
该程序有1个源文件:CompanySalary.java。
程序模板如下:
CompanySalary.java
----------------------------------------
abstract class Employee {
public abstract double earnings();
}
class YearWorker extends Employee {
public double earnings() {
【代码1】 //重写earnings()方法
}
}
class MonthWorker extends Employee {
public double earnings() {
【代码2】 //重写earnings()方法
}
}
class WeekWorker extends Employee {
public double earnings() {
【代码3】 //重写earnings()方法。
}
}
class Company {
Employee[] employee;
double salaries=0;
Company(Employee[] employee) {
this.employee=employee;
}
public double salariesPay() {
salaries=0;
for(Employee i:employee) {
【代码4】 //计算一年应支付给雇员的薪水总额salaries。注意使用复合赋值运算符。
}
return salaries;
}
}
public class CompanySalary {
public static void main(String args[]) {
Employee [] employee=new Employee[29]; //公司有29名雇员
for(int i=0;i<employee.length;i++) { //雇员简单地分成三类
if(i%3==0)
employee[i]=new WeekWorker();
else if(i%3==1)
employee[i]=new MonthWorker();
else if(i%3==2)
employee[i]=new YearWorker();
}
Company company=new Company(employee);
System.out.println("公司薪水总额:"+company.salariesPay()+"元");
}
}
回答以下问题:
(1)子类YearWorker如果不重写earnings()方法,程序编译时是否会出现错误_____________(回答是或者否)?
(2)通过分析该程序,在该公司中,拿年薪的职员有_____________个,拿月薪的职员有_____________个,拿周薪的职员有_____________个。
(1) return 50000;
(2) return 27600;
(3) return 38000;
(4) salaries+=i.earnings();
(5) 是
(6) 9
(7) 10
(8) 10