JAVA:使用面向对象的多态性模仿会员卡消费系统,设计会员卡类,可派生不同的会员卡类型,当使用不同的会员卡消费时其折扣不同。

使用面向对象的多态性模仿会员卡消费系统,设计会员卡类,可派生不同的会员卡类型,当使用不同的会员卡消费时其折扣不同。如一般会员卡消费打9折;VIP会员卡打7折;超级VIP卡打5折。其具体的实现效果如下所示:

输入应消费的金额->选择相应的会员卡->显示实际的应付金额和消费状态信息。

实验要求:

  1. 程序设计必须符合面向对象的编程思想;
  2. 设计会员卡类,包含卡类型和卡内金额两个属性;
  3. 由会员卡类进一步派生出不同类型的会员卡,如:一般会员卡消费打9折;VIP会员卡打7折;超级VIP卡打5折;
  4. 对不同会员卡类进行具体实现;
  5. 设计并实现刷卡机类,主要用于人机交互和显示消费状态信息;
  6. 创建不同类型会员卡的具体对象,并进行相应调用显示消费状态信息。

      实验目的

  1. 掌握方法的继承,重载与覆盖;
  2. 掌握抽象类的定义与继承;
  3. 理解多态的概念,掌握接口的实现方法。
package nchu.demo1;
import java.util.Scanner;
public class Membership1 {
    private String kind;  //会员卡类型
    private double discount;  //折扣大小
    private double balance;  //余额
    public Membership1() {
        }

    public String getKind() {
        return kind;
    }

    public void setBalance(double balance) {
            this.balance = balance;
        }

    public double getBalance() {
        return balance;
    }

    public double getDiscount() {
        return discount;
    }

        public double deduct(double x){
            return getBalance()-x*getDiscount();
        }

        //改变余额的方法
        public double lastBalance(double x){
            setBalance(getBalance()-x*getDiscount());
            return getBalance();
        }

    }

    class AMembership1 extends Membership1 {

        private String kind="A类会员卡";


        public String getKind() {
            return kind;
        }

        @Override
        public double deduct(double x){
            return getBalance()-x*0.5;
        }

        //改变余额的方法
        public double lastBalance(double x){
            //其实应该把每个成员变量用get来调用,然后在定义的时候每个成员变量都私有化
            //this.balance = getBalance()-discount*getDiscount();
            setBalance(getBalance()-x*0.5);
            return getBalance();
        }
    }

    class BMembership1 extends Membership1 {
        private String kind="B类会员卡";

        public String getKind() {
            return kind;
        }

        @Override
        public double deduct(double x){
            return getBalance()-x*0.7;
        }

        //改变余额的方法
        public double lastBalance(double x){
            //其实应该把每个成员变量用get来调用,然后在定义的时候每个成员变量都私有化
            //this.balance = getBalance()-discount*getDiscount();
            setBalance(getBalance()-x*0.7);
            return getBalance();
        }
    }

    class CMembership1 extends Membership1 {
        private String kind="C类会员卡";

        public String getKind() {
            return kind;
        }
        @Override
        public double deduct(double x){
            return getBalance()-x*0.9;
        }

        //改变余额的方法
        public double lastBalance(double x){
            //其实应该把每个成员变量用get来调用,然后在定义的时候每个成员变量都私有化
            //this.balance = getBalance()-discount*getDiscount();
            setBalance(getBalance()-x*0.9);
            return getBalance();
        }
    }

    class Poss {
        //余额是卡的属性,所以扣钱功能封装在卡的方法里,这里简易的设计一个“消费金额”,和一个判断卡内余额是否足够支付的方法
        private double consume;

        public Poss() {
        }

       //多态实现1
        public boolean jud(Membership1 p){
            if(p.deduct(consume)>0)
                return true;
            else  {System.out.println("余额不足!"); return false;}
        }

        public double getConsume() {
            return consume;
        }


        public void setConsume(double consume) {
            this.consume = consume;
        }
    }

    class MemTest {
        public static void main(String[] args) {

            Poss mc = new Poss(); //一台刷卡机
            //三种卡,因为构造器不能继承,所以用set初始化每张卡余额
            System.out.println("请输入商品价格为:");
            Scanner sc = new Scanner(System.in);
            //模拟人对刷卡机输入需要扣除的钱
            double price = sc.nextDouble();
            mc.setConsume(price);
            Membership1 vipA = new AMembership1(); vipA.setBalance(2000); useMem(vipA,mc);
            Membership1 vipB = new BMembership1(); vipB.setBalance(1000); useMem(vipB,mc);
            Membership1 vipC = new CMembership1(); vipC.setBalance(500);  useMem(vipC,mc);
        }
        //多态实现2;懒得写instanceof了
            public static void useMem(Membership1 vip,Poss mc){
                System.out.println("正在使用:"+ vip.getKind());
                if (mc.jud(vip)) {   //如果余额足够
                    System.out.println("购买成功!卡内余额为:"+vip.lastBalance(mc.getConsume()));
                }else return;
            }
    }
  1. 多态不能调用子类的特殊功能,只能调用父类中原本就有的方法,或子类重写父类的方法。
  2. 多态即对象的多种形态
  3. 确保多态中,对象是我想要的那个类new出来的对象,可以用instanceof。
  4. 继承后子类也不能调用父类的私有化的成员变量,但可以通过get、set方法去调用。
  5. 一个儿子不能有多个爹,一个爹可以有多个儿子
  6. 封装:对象代表什么就得封装对应的数据,并提供数据对应的行为。

仅供参考!

你可能感兴趣的:(java基础,java,开发语言)