现在碰到一题,是做一个小小的点菜系统,有个问题是:餐馆分VIP和非VIP顾客,VIP顾客结账时打8折。题目要求写代码时要体现继承和多态,我想不到怎么写才能体现这两个技术,特别是多态!其它要求像读取txt文件都会了,只差这一点了,知道的高手帮一下,指点下思路或写段代码给我参考琢磨下!

解决方案 »

  1.   

    VIP和非VIP都是顾客,顾客是父类,VIP和非VIP是两个子类,这样是继承,两个子类的结账方法行为不同,子类分别覆盖父类的结账方法,当一个顾客结账时,VIP或非VIP将有不同的结账方式,这是多态。
      

  2.   

    多态:一个对象变量可以指向多种实际类型的现象。
    7.3.1. 方法的覆盖(overridding)
    当子类从父类继承一个无参方法,而又定义了一个同样的无参方法,则子类新写的方法覆盖父类的方法,称为覆盖。(注意返回值类型也必须相同,否则编译出错。)
    如果方法参数表不同,则成重载。
    特点:
    1.对于方法的访问限制修饰词,子类方法要比父类的访问权限更高。
    父类为public,那么子类为private则出现错误。
    2.子类抛出的异常应该是父类抛出的异常或其子类。
    7.3.2. 多态的分类
    多态分两种:
    1编译时多态:编译时动态重载;
    2运行时多态:指一个对象可以具有多个类型,方法的覆盖
    这样对于对象而言分为:
    理解运行时多态:
    Car c = new Bus();
    Car编译时类型    编译时检查变量类型是否存在,是否有调用的方法
    Bus运行时类型 实际运行是访问heep中的对象,调用实际的方法。
    运行时多态是由运行时类型决定的
    编译时多态是由编译时类型决定的
    猫,小鸟,狗 都是动物,都可以安上动物的标签。
    Interface Animal{}
    Class Car implements Animal{}
    Class Bird implements Animal{}
    Class Dog implements Animal{}
    方法中
    Animal a = new Car();
    Animal b = new Bird();
    Animal c = new Dog();*方法重载看的是参数的编译时类型public class Animal{
    public static void main(String[] args){ }
    }
    (1)    是覆盖吗?不能多态了
    abstract class MyClass{
    priavate void m();
    }
    class Sub extends MyClass(){
    public void m();
    }
    (2)   错误的修饰符组合
    abstract class MyClass{
    priavate abstract void m();
    }
    class Sub extends MyClass(){
    public void m();
    }
    (3)  5.0 新  非覆盖 
    abstract class MyClass{
    private final void m();
    }
    class Sub extends MyClass(){
    public void m();
    }
      

  3.   

    VIP或非VIP将有不同的结账方式,属于方法的重载(方法名相同参数不同),不是覆盖。这个多态的最简单体现。父类楼主可以考虑抽象类 ,这个是个人建议了!
      

  4.   

    这个问题肯定要用多态来解决么,不然的话,一大堆if else,多恶心。
      

  5.   

    //多态的两个非常重要的也是核心的两个规则
    //1.如果一个子类对象当做父类对象来看,子类对象只能调用父类对象
    //2.如果一个子类对象当做父类对象来看,调用的方法在子类中得到了重写,那么子类对象只能调用自己类的这个方法
    public class CsdnTest {
    public static void main(String[] args) {
    Client c1=new VIPClient("zhangsan",26);//这里体现多态.把VIP顾客当做一个顾客来看,但是调用BUY方法时一定会调用它自己的BUY方法,这就是多态
    Client c2=new CommonClient("lisi",53);
    c1.buy();
    c2.buy();
    }
    }class Client { // 顾客的父类
    private String name;
    private int age; public Client(String name, int age) {
    this.name = name;
    this.age = age;
    } public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public int getAge() {
    return age;
    } public void setAge(int age) {
    this.age = age;
    } public void buy(){

    }
    }class VIPClient extends Client { // VIP顾客 继承顾客类 public VIPClient(String name, int age) {
    super(name, age);
    } @Override
    public void buy() {
    System.out.println("VIP顾客购物打八折");
    }}class CommonClient extends Client { public CommonClient(String name, int age) {
    super(name, age);
    } @Override
    public void buy() {
    System.out.println("普通顾客不打折!");
    }}