(Java)多态

(来源:韩顺平视频课)

java中多态是个难以理解的概念,但同时又是一个非常重要的概念。java三大特性之一(继承,封装,多态),我们可以从字面上简单理解:就是一种类型的多种状态,以下通过卖小汽车的例子说明什么是多态。

//用接口实现多态

public class Demo127 {

    public static void main(String []args){

        CarShop aShop=new CarShop();

        //卖出一辆宝马

        aShop.sellCar(new BMW());

        //卖出一辆奇瑞QQ

        aShop.sellCar(new CheryQQ());

        //卖出一辆桑塔纳

        aShop.sellCar(new Santana());

        System.out.println("总收入:"+aShop.getMoney());

    }

}

//汽车接口

interface Car{

    //汽车名称

    String getName();

    //获得汽车售价

    int getPrice();

}

//宝马

class BMW implements Car{

    public String getName(){

        return "BMW";

    }

    public int getPrice(){

        return 300000;

    }

}

//奇瑞QQ

class CheryQQ implements Car{

    public String getName(){

        return "CheryQQ";

    }

    public int getPrice(){

        return 20000;

    }

}

//桑塔纳汽车

class Santana implements Car{

    public String getName(){

        return "Santana";

    }

    public int getPrice(){

        return 80000;

    }

}

//汽车出售店

class CarShop{

    //售车收入

    private int money=0;       

    //卖出一部车

    public void sellCar(Car car){ //此处Car car为后期绑定,因为在编译器编译时,并不知道car的具体类型

        System.out.println("车型:"+car.getName()+"单价:"+car.getPrice

 

());

        //增加卖出车售价的收入

        money+=car.getPrice();

    }

    //售车总收入

    public int getMoney(){

        return money;

    }

}

运行结果:

车型:BMW 单价:300000

车型:CheryQQ 单价:20000

总收入:320000

 

继承是多态得以实现的基础。从字面上理解,多态就是一种类型(都是Car类型)表现出多种状态(宝马汽车的名称是BMW,售价是300000;奇瑞汽车的名称是CheryQQ,售价是2000)。将一个方法调用同这个方法所属的主体(也就是对象或类)关联起来叫做绑定,分前期绑这下和后期绑定两种。下面解释一下它们的定义:

1、前期绑定:在程序运行之前进行绑定(即在编译时就确定数据类型),由编译器和连接程序实现,又叫做静态绑定。比如static方法和final方法,注意,这里也包括private方法,因为它是隐式final的。

2、后期绑定:在运行时根据对象的类型进行绑定(即在运行时确定数据类型),由方法调用机制实现,因此又叫做动态绑定,或者运行时绑定。除了前期绑定外的所有方法都属于后期绑定。

 

多态就是在后期绑定这种机制上实现的。多态给我们带来的好处是消除了类之间的偶合关系,使程序更容易扩展。比如在上例中,新增加一种类型汽车的销售。只需要让新定义的类实现Car类并实现它的所有方法,而无需对原有代码做任何修改,CarShop类的sellCar(Car

car)方法就可以处理新的车型了。

新增代码如下:

java代码

//桑塔纳汽车

class Santana implements Car{

    public String getName(){

        return "Santana";

    }

    public int getPrice(){

        return 80000;

    }

}

猜你喜欢

转载自blog.csdn.net/qq_36084640/article/details/83903695
今日推荐