thentransactionfails
else
balance=0.0
decrementoverdraftAmountbyoverdraftNeeded
else
decrementbalancebyamount
4.创建TestBanking类:
·该类文件位于包:
com.mybank.test
·该类有程序入口main()函数;
·要求:
创建一名客户的若干个不同类型的账户信息,然后依次访问每一个账户,并根据不同类型的账户信息做出不同的操作。
(要求使用instanceof运算符测试判断账户的类型信息,如果是SavingsAccount,则计算账户的利息;如果是CheckingAccount,则进行取钱操作,可以进行适当额度的透支);
·最后输出客户账户的余额信息。
(4)实验内容二:
能够创建抽象类和接口,并探究它们的多态特性
具体要求:
1.创建项目:
InterfaceProject;
2.创建Animal类,该类是抽象类:
·声明一个受保护的整数实例变量legs,记录动物的腿的数目;
·定义一个受保护的构造方法来初始化legs实例变量;
·声明抽象方法eat;
·声明具体方法walk来显示与动物行走方式有关的信息(包括腿的数目);
3.创建Pet接口:
声明三个抽象方法:
publicStringgetName();
publicvoidsetName(Stringn);
publicvoidplay();
4.创建Spider类:
·Spider类扩展了Animal类;
·定义一个无参数构造方法,调用父类构造方法来指明所有蜘蛛都有八条腿;
·实现eat方法;
5.创建Cat类:
·声明String实例变量来存储宠物的名字;
·定义一个构造方法,使用String参数来指定猫的名字;该构造方法必须调用父类构造方法来指明所有猫都有四条腿;
·另外定义一个无参数的构造方法,该构造方法调用上一个构造方法(使用this关键字)来传递一个空字符串作为参数;
·实现Pet接口方法;
·实现eat方法;
6.创建Fish类:
·声明String实例变量来存储宠物的名字;
·定义一个无参数的构造方法,该构造方法调用父类构造方法来指明鱼没有腿;
·实现Pet接口方法;
·覆盖walk方法,该方法调用所有的超级方法,并打印输出一条说明鱼不会行走的消息;
·实现eat方法;
7.创建TestAnimal类:
·该类有程序入口main()函数;
·创建并操作前面所创建的类的实例;
·调用每个对象中的方法;
·对象类型转换;
·使用多态特性;
·使用super关键字调用父类方法。
五、实验要求及总结
1.结合上课内容,对上述程序先阅读,然后上机并调试程序,并对实验结果写出你自己的分析结论。
2.整理上机步骤,总结经验和体会。
3.完成实验报告和上交程序。
实验三1:
实验结果:
Account.java:
packagecom.mybank.domain;
importcom.mybank.test.*;
publicclassAccount{//创建Account类
privatedoublebalance;
publicvoidinitBalance(doublebalance){
this.balance=balance;
}
publicbooleandeposit(doubleamt){// deposit(double
//amt),用于向帐户存钱,返回值是boolean型;
if(amt>0){
balance=balance+amt;
returntrue;
}else{
returnfalse;
}
}
publicbooleanwithdraw(doubleamt){//withdraw(doubleamt),用于从帐户取钱
if(balance>amt){
balance=balance-amt;
returntrue;
}else{
returnfalse;
}
}
publicdoublegetBalance(){//getBalance(),用于返回balance的值
returnbalance;
}
}
Customer1.java:
packagecom.mybank.domain;
publicclassCustomer1{//创建Customer1类
privateStringfirstname;
privateStringlastname;
privateAccountaccouts[]=newAccount[10];
privateintnumberofaccout;
publicCustomer1(Stringfirstname,Stringlastname){//公有构造方法
this.firstname=firstname;
this.lastname=lastname;
numberofaccout=0;
}
publicStringgetFirstName(){//getFirstName方法:
该方法返回客户的firstName实例变量;
returnfirstname;
}
publicStringgetLastName(){// getLastName方法:
该方法返回客户的lastName实例变量;
returnlastname;
}
publicvoidaddaccout(Accountaccout){//addAccount方法
accouts[numberofaccout]=accout;
numberofaccout++;
}
publicintgetnumberofaccout(){//getNumberOfAccounts方法:
该方法返回numberOfAccounts实例变量
returnnumberofaccout;
}
publicAccountgetaccout(intindex){// getAccount方法:
该方法返回与指定的index数组下标相关的帐户对象。
returnaccouts[index];
}
}
Savingaccout.java:
packagecom.mybank.domain;
publicclassSavingaccoutextendsAccount{//创建SavingsAccount类,该类是Account类的子类:
privatedoubleinterestrate;// 添加interestRate实例变量;
publicSavingaccout(doublebalance,doubleinterestrate){//公有构造方法
super.initBalance(balance);//调用父类构造方法传递initBalance参数
this.interestrate=interestrate;
}
publicdoubleaccumulateinterest(){//accumulateInterest方法:
用于计算客户的利息。
returnthis.getBalance()*interestrate;
}
}
Checkingaccout.java:
packagecom.mybank.domain;
publicclassCheckingaccoutextendsAccount{//创建CheckingAccount类,Account类的子类:
privatedoubleoverdraftamount;
publicCheckingaccout(intbalance,doubleoverdraftamount){//有两个参数的公有构造方法
super.initBalance(balance);
this.overdraftamount=overdraftamount;
}
publicCheckingaccout(intbalance){//只有一个参数initBalance的另一个公有构造方法
this(balance,0.0);
}
publicbooleanwithdraw(doubleamount){//覆盖withdraw方法
if(this.getBalance()doubleoverdraftneeded=amount-this.getBalance();
if(overdraftamountreturnfalse;
}else{
this.initBalance(this.getBalance()-amount);
}
}else{
this.initBalance(this.getBalance()-amount);
}
returntrue;
}
}
Testingbank1.java:
packagecom.mybank.test;
importcom.mybank.domain.*;
publicclassTestingbank1{
publicstaticvoidmain(String[]args){//创建TestBanking类
/*创建异类集合*/
Customer1customer=newCustomer1("zhao","zhen");
customer.addaccout(newCheckingaccout(500,100));
customer.addaccout(newSavingaccout(500,0.02));
/*使用instanceof运算符测试判断账户的类型信息*/
for(inti=0;iif(customer.getaccout(i)instanceofCheckingaccout){
Checkingaccoutm=(Checkingaccout)customer.getaccout(i);
m.withdraw(550);
m.deposit(100);
m.withdraw(900);
m.deposit(100);
}
if(customer.getaccout(i)instanceofSavingaccout){
Savingaccoutm=(Savingaccout)customer.getaccout(i);
m.accumulateinterest();
m.deposit(100);
m.withdraw(50);
}
}
/*最后输出客户账户的余额信息。
*/
for(inti=0;iSystem.out.println(customer.getaccout(i).getBalance());
}
}
}
实验三2:
实验结果:
实验改进之处:
创建Sleep接口拓展Pet接口。
Animal.java:
publicabstractclassAnimal{//创建Animal类,该类是抽象类:
protectedintlegs;
publicAnimal(){
}
protectedAnimal(intlegs){
this.legs=legs;
}
abstractvoideat();//抽象方法eat;
publicvoidwalk(){//具体方法walk来显示与动物行走方式有关的信息(包括腿的数目);
System.out.println("thisanimalwalkon"+legs+"legs");
}
}
publicinterfacePet{//创建Pet接口:
声明三个抽象方法
publicabstractStringgetname();
publicabstractvoidsetname(Stringpet_name);
publicabstractvoidplay();
}
publicinterfaceSleepextendsPet{//创建Sleep接口,继承Pet
voidsleep();
}
Spider.java:
publicclassSpiderextendsAnimalimplementsPet,Sleep{//创建Spider类,Spider类扩展了Animal类
privateStringpet_name;
publicSpider(){
super(8);
}
voideat(){//实现eat方法
System.out.println("Spidereatfly");
}
publicvoidsetname(Stringpet_name){
this.pet_name=pet_name;
}
publicvoidplay(){
System.out.println("thespiderplayinhands");
}
publicStringgetname(){
returnpet_name;
}
publicvoidspeak(){
System.out.println("thecatmakesnonoise");
}
publicvoidsleep(){//实现Sleep接口方法
System.out.println("thecatsleeponthewall");
}
}
Cat.java:
publicclassCatextendsAnimalimplementsPet,Sleep{//创建Cat类
privateStringpet_name;
publicCat(Stringpet_name){//构造方法
super(4);
this.pet_name=pet_name;
}
publicCat(){//定义一个无参数的构造方法
this(null);
}
publicvoidspeak(){
System.out.println("thecatspeakwithmaomao");
}
voideat(){//实现eat方法;
System.out.println("thecatslikeeattingfish");
}
/*实现Pet接口方法*/
publicvoidplay(){
System.out.println("thecatplaywithmice");
}
publicStringgetname(){
returnpet_name;
}
publicvoidsetname(Stringpet_name){
this.pet_name=pet_name;
}
publicvoidsleep(){//实现Sleep接口方法
System.out.println("thecatsleepwithherhost");
}
}
Fish.java:
publicclassFishextendsAnimalimplementsPet,Sleep{//创建Fish类
privateStringpet_name;
publicFish(){
super(0);
}
/*实现Pet接口方法*/
publicStringgetname(){
returnpet_name;
}
publicvoidsetname(Stringpet_name){
this.pet_name=pet_name;
}
publicvoidplay(){
System.out.println("thefishswiminwater");
}
voideat(){//实现eat方法
System.out.println("thefisheatrice");
}
publicvoidwalk(){//覆盖walk方法
System.out.println("thisanimaldoesnothavelegs");
}
publicvoidspeak(){
System.out.println("thefishmakesnonoise");
}
publicvoidsleep(){//实现Sleep接口方法
System.out.println("thefishsleepwithwater");
}
}
TestAnimal.java:
publicclassTestAnimal{//创建TestAnimal类
publicstaticvoidmain(String[]args){
Petpet[]=newPet[3];
pet[0]=newCat();//创建并操作前面所创建的类的实例
pet[1]=newFish();
pet[2]=newSpider();
for(Peti:
pet){//调用每个对象中的方法
i.play();
Animalanimal=(Animal)i;//对象类型转换,使用多态特性
animal.walk();
Sleepsleep=(Sleep)i;
sleep.sleep();
}
for(inti=0;i<3;i++){//使用instanceof,向下转型
if(pet[i]instanceofCat){
Catm=(Cat)pet[i];
m.speak();
}
if(pet[i]instanceofFish){
Fishm=(Fish)pet[i];
m.speak();
}
if(pet[i]instanceo