wz26

多态性(面向对象特征三)

多态性在Java中有三种体现:

  • 方法的重载overload
  • 方法的重写override
  • 对象的多态性——主要应用在抽象类和接口上

对象的多态性:Java引用变量有两个类型,编译时类型,运行时类型。编译时类型有声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就出现了多态。

多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。

多态的特性就是,运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法。这种不确定性的方法调用,究竟有什么作用?

  • 案例1:输出对不同明星的爱
package test;

class PrintA{
    public void fun(){
        System.out.println("I love you");
    }
}
class James extends PrintA{
    @Override
    public void fun(){
        System.out.println("I love you James.");
    }
}
class Kobe extends PrintA{
    @Override
    public void fun(){
        System.out.println("I love you Kobe.");
    }
}

public class Iloveyou{
    public static void printName(PrintA b){ //
        b.fun();
    }
    public static void main(String[] args) {
        printName(new Kobe());
    }
}

//运行结果为:I love you kobe.
  • 案例2:对于收入,收税0.1%,对于工作薪资,收税(x-5000)*0.2,对于享受国家优惠的,收税0。计算给出的几个人不同税的总和。
package test;

class IncomeTax { //对于收入
    protected double income;

    public IncomeTax(double income) {
        this.income = income;
    }

    public double tax() {
        return this.income * 0.1;
    }
}

class SalaryTax extends IncomeTax { //对于工作薪资
    public SalaryTax(double income) {
        super(income);
    }

    @Override
    public double tax() {
        return (this.income - 5000) * 0.2;
    }
}

class SpecialTax extends IncomeTax {//对于享受国家优惠的特殊人群收入
    public SpecialTax(double income) {
        super(income);
    }

    @Override
    public double tax() {
        return 0;
    }
}

public class MainClass {  //运行类
    public static void main(String[] args) {
        IncomeTax[] a = new IncomeTax[]{new IncomeTax(4000), new IncomeTax(34500),
                new SalaryTax(9000), new SpecialTax(454564)};
        System.out.println(totalTax(a));

    }
    public static double totalTax (IncomeTax...b){
        double total = 0;
        for (IncomeTax it:b){
            total=total+it.tax();
        }
        return total;
    }
}

//运行结果为4650.0
/*
利用多态,totalTax()方法只需要和IncomeTax打交道,它完全不需要知道SalaryTax和SpercialTax的存在,就可以正确计算出总的税。如果我们要新增一种稿费收入,只需要从IncomeTax派生,然后正确重写Tax()方法就可以。把新的类型传入totalTax(),不需要修改任何代码。
*/
上一篇:学习java的第三周


下一篇:【状压dp】最短Hamilton路径