实验名称 类的继承与多态
实验类型 验证性 实验学时 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){
this.type = type;
}
public Card(String type, int amount){
this.type = type;
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;
}
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 mc.comsume(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。抽象方法所在的类必须是抽象类。多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为。当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。那么当子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个上转的对象在调用这个方法时就可能具有多种形态。