java类的继承与多态实验报告
实验名称 类的继承与多态
实验类型 验证性 实验学时 2
实验⽬的
1.掌握⽅法的继承,重载与覆盖。
2.掌握抽象类的定义与继承。
3.理解多态的概念,掌握接⼝的实现⽅法。
实验设备
Windows计算机、JDK开发包、eclipse软件开发⼯具。
⼀、实验原理(要求、任务等)
1、类的继承性
继承是⼀种由已有的类创建新类的机制。利⽤继承,可以先创建⼀个共有属性的⼀般类,根据该⼀般类再创建具有特殊属性的新类,新类继承⼀般类的属性和⾏为,并根据需要增加⾃⼰的新的属性和⾏为。由继承⽽得到的类称为⼦类,被继承的类称为⽗类(超类)。Java不⽀持多重继承(⼦类只能有⼀个⽗类)。
2、多态性
多态性就是指⽗类的某个⽅法被其⼦类重写时,可以各⾃产⽣⾃⼰的功能⾏为。
当⼀个类有很多⼦类时,并且这些⼦类都重写了⽗类中的某个⽅法。那么当⼦类创建的对象的引⽤放到⼀个⽗类的对象中时,就得到了该对象的⼀个上转型对象,那么这个上转的对象在调⽤这个⽅法时就可能具有多种形态。
⼆、实验内容和步骤
使⽤⾯向对象的多态性模仿会员卡消费系统,设计会员卡类,可派⽣不同的会员卡类型,当使⽤不同的会员卡消费时其折扣不同。如⼀般会员卡消费打9折;VIP会员卡打7折;超级VIP卡打5折。其具体的实现效果如下图所⽰:
输⼊应消费的⾦额,选择相应的会员卡,会显⽰实际的应付⾦额和消费状态信息。
实验步骤:
1、设计会员卡类,包含卡类型和卡内⾦额两个属性。
2、由会员卡类进⼀步派⽣出不同类型的会员卡,如:⼀般会员卡消费打9折;VIP会员卡打7折;超级VIP卡打5折。
3、对不同会员卡类进⾏具体实现。
4、设计并实现类,主要⽤于⼈机交互和显⽰消费状态信息。
5、创建不同类型会员卡的具体对象,并进⾏相应调⽤显⽰消费状态信息。
实例化类和实例化对象其程序实现后的项⽬结构如下图所⽰:
三、实验结果与分析
详细代码:
public abstract class Card{
String type;
float amount;
public Card(){
}
public Card(String type){
}
public Card(String type,int amount){
this.amount = amount;
}
public String getType(){
return type;
}
public boolean comsume(float totalPrice){
if(this.amount >=this.shouldPay(totalPrice)){
this.amount =this.amount -this.shouldPay(totalPrice);
return true;
}else{
return false;
}
}
public abstract float shouldPay(float totalPrice);
public float getAmount(){
return amount;
return amount;
}
public void setAmount(float amount){
this.amount = amount;
}
}
public class generalCard extends Card{
public float shouldPay(float totalPrice){
totalPrice = totalPrice *0.9f;
return totalPrice;
}
}
public class vipCard extends Card{
public float shouldPay(float totalPrice){
totalPrice = totalPrice *0.7f;
return totalPrice;
}
}
public class svipCard extends Card{
public float shouldPay(float totalPrice){
totalPrice = totalPrice *0.5f;
return totalPrice;
}
}
public class POS {
public static boolean slide(Card mc,float cosume){
return mcsume(cosume);
}
}
public class test {
public static void main(String[] args){
float cosumePrice=100.0f;
System.out.println("消费⾦额为"+cosumePrice);
generalCard mc=new generalCard();
mc.amount=150;
if(POS.slide(mc,cosumePrice)){
System.out.println("刷卡成功");
System.out.println("余额为"+mc.getAmount());
}
else{
System.out.println("卡内余额不⾜,请充值");
}
}
}
输出结果如下图所⽰:
代码思路分析:
⾸先要创建⼀个会员卡Card类,⾥⾯包含卡类型和卡内⾦额两个属性。⼀般会员卡、vip会员卡和超级vip会员卡都是他的⼦类。通过分析可知,⼦类继承⽗类的⼀些属性和功能,但是都要重写实际付款⾦额shouldPay这个⽅法。这个时候就可以将shouldPay⽅法写成抽象⽅法,以此同时,⽗类必须要写成抽象类。这三个⼦类只⽤重写⽗类的shouldPay⽅法。将传过来的参数乘以打的折数之后再返回。会员卡类⾥还要写⼀个判断卡内余额和应付⾦额的⽐较的comsume⽅法。然后就是还要写⼀个POS机类。这个类⾥⾯写了⼀个slide⽅法,这个⽅法传过来两个参数,第⼀个参数是Card类型,因为Card是这三个⼦类的上级⽗类,在运⾏的时候还是看的是(右边)⼦类。这⾥⽤的是上转型对象。然后这个⽅法调⽤了comsume⽅法,返回给主函数⼀个boolean值。然后test类写下要测试的值,运⾏之后即可看到结果。
四、总结与⼼得体会
思考题
1、会员卡类中定义了哪些⽅法,都有什么意义?
⾸先定义了三个构造⽅法,⽆参构造⽅法必须要写,⼦类默认继承⽗类的⽆参构造⽅法。有参构造⽅法⽤来初始化。然后getType、getAmount⽅法⽤来获取type和amount。然后comsume⽤来表⽰是否⽀付成功。shouldPay⽅法是抽象⽅法⽤来让⼦类重写。setAmonut⽅法是给amount重新赋值。
2、如何调⽤不同类型会员卡类中所重写的⽅法?
先将要调⽤类型会员卡类实例化为对象,然后对象.⽅法名调⽤即可。
总结
⼦类会继承⽗类的属性和⽅法。⽅法的继承就是原封不动的被继承下来,重载就是在⼦类中写⼀个⽗类⽅法名⼀样的,但是参数和返回值等不⼀样的⽅法。⽅法的重写就是和⽗类的⽅法框架⼀模⼀样,但是内容不⼀样。抽象类不可以创建对象,抽象类⾥⾯⼀般会有抽象⽅法。抽象类声明时,只需要在class前加⼀个abstract。抽象⽅法所在的类必须是抽象类。多态性就是指⽗类的某个⽅法被其⼦类重写时,可以各⾃产⽣⾃⼰的功能⾏为。当⼀个类有很多⼦类时,并且这些⼦类都重写了⽗类中的某个⽅法。那么当⼦类创建的对象的引⽤放到⼀个⽗类的对象中时,就得到了该对象的⼀个上转型对象,
那么这个上转的对象在调⽤这个⽅法时就可能具有多种形态。