zoukankan      html  css  js  c++  java
  • java之多态详解

    前言

    什么叫多态?多态就是一种事物可以有多种表现形式

    多态三要素

    1.被动方必须有继承关系

    2.子类一般都要重写父类方法

    3.必须将主动方的功能函数的参数设置为 被动方父类的类型

    举个例子司机开车

     假如说司机会开汽车  我们需要定义个汽车的类  然后在司机类中添加会开汽车的的方法
    假如说司机会开卡车 我们需要再定义一个卡车的类  然后在司机类中添加会开卡车的方法下面看下传统的调用方式  代码如下:

    class Car
    {
    	private String name;
    
    	//无参 构造方法
    	public Car(){}
    	// 有参构造方法
    	public Car(String name){
    		this.name = name;
    	}
    	public void setName(String name){
    		this.name = name;
    	}
    	public String getName(){
    		return this.name;
    	}
    	public void run(){}
    }
    
    class Bus extends Car
    {
    	public Bus(){}
    	public Bus(String name){
    		super(name);
    	}
    	public void run(){
    		System.out.println("公交车在跑");
    	}
    }
    
    class SmallCar extends Car
    {
    	public SmallCar(){}
    	public SmallCar(String name){
    		super(name);
    	}
    	public void run(){
    		System.out.println("小轿车在跑");
    	}
    }
    
    class Drivers
    {
    	//假如司机会开公交车
    	public void driverBus(Bus b){
    		b.run();
    	}
    
    	//假如司机会开小轿车
    	public void driverSmallCar(SmallCar smcar){
    		smcar.run();
    	}
    }
    
    
    
    class  TestDt
    {
    	public static void main(String[] args) 
    	{
    		Drivers d = new Drivers();
    		
    		//司机开公交车
    		d.driverBus(new Bus("公交车"));
    		d.driverSmallCar(new SmallCar("小轿车"));
    	}
    }
    

     正如上面的列子 在添加司机开其他的车 就会重复上面的行为 缺点是 扩展性比较差,后期代码维护困难。

    然后我们用多态的写法优化上述例子 代码如下:

    class Car
    {
    	private String name;
    
    	//无参 构造方法
    	public Car(){}
    	// 有参构造方法
    	public Car(String name){
    		this.name = name;
    	}
    	public void setName(String name){
    		this.name = name;
    	}
    	public String getName(){
    		return this.name;
    	}
    	public void run(){}
    }
    
    class Bus extends Car
    {
    	public Bus(){}
    	public Bus(String name){
    		super(name);
    	}
    	public void run(){
    		System.out.println("公交车在跑");
    	}
    }
    
    class SmallCar extends Car
    {
    	public SmallCar(){}
    	public SmallCar(String name){
    		super(name);
    	}
    	public void run(){
    		System.out.println("小轿车在跑");
    	}
    }
    
    class Drivers
    {
    	public void driverCar(Car car){
    		car.run();
    	}
    }
    
    
    
    class  TestDt
    {
    	public static void main(String[] args) 
    	{
    		Drivers d = new Drivers();
    		
    		d.driverCar(new Bus("公交车"));
    		d.driverCar(new SmallCar("小轿车"));
    	}
    }
    

     比较第一种写法  假如司机还会开其他的车 只需要添加会开这种车的类就行  司机类不需要再添加其它功能方法 。代码简介  后期维护比较方便  这种编写多态的形式也叫向上转型。

    但是要想调用子类独有的方法必须向下转型才能调用

  • 相关阅读:
    SQL Server存储过程(二)
    WPF 小知识 (设置背景图)
    关于SQL Server中索引使用及维护简介
    学习asp.net比较完整的流程(转)
    web开发常用默认端口
    接口和类的几大区别
    WEB建站规划之建站目的
    个人经验:页面无刷新传输数据的多种方法总结
    旅游电子商务探讨
    vs2008中文版提供下载(包含中文msdn)
  • 原文地址:https://www.cnblogs.com/nianzhilian/p/8723528.html
Copyright © 2011-2022 走看看