zoukankan      html  css  js  c++  java
  • Java开发笔记(五十一)多态的发生场景

    江湖上传闻,面向对象之所以厉害,是因为它拥有封装、继承与多态三项神技,只要三板斧一出,号令天下谁敢不从。前面费了老大的劲才讲清楚封装和继承,那么多态又是怎样的神乎其神呢?下面先通过一个简单的例子来说明多态的使用场景。
    首先把鸡这种家禽通过面向对象来表达,方便起见只定义两个属性(名称和性别),以及一个call方法,定义好的鸡类代码如下所示:

    //定义一个鸡类
    public class Chicken {
    
    	// 定义一个名称属性
    	public String name;
    	// 定义一个性别属性
    	public int sex;
    	
    	// 定义一个叫唤方法
    	public void call() {
    		System.out.println("半夜鸡叫");
    	}
    }
    

    接着从上面的Chicken类派生出公鸡类Cock,将公鸡的性别固定设置为雄性,同时重写call这个叫唤方法。公鸡类的代码示例如下:

    //定义一个继承自鸡类的公鸡类
    public class Cock extends Chicken {
    	
    	public Cock() {
    		// 公鸡的性别固定为雄性
    		sex = 0;
    	}
    
    	// 重写了公鸡的叫唤方法
    	public void call() {
    		System.out.println("喔喔喔");
    	}
    }
    

    同样编写母鸡类Hen继承自Chicken类,将母鸡的性别固定设置为雌性,同时重写call这个叫唤方法。母鸡类的代码示例如下:

    //定义一个继承自鸡类的母鸡类
    public class Hen extends Chicken {
    	
    	public Hen() {
    		// 母鸡的性别固定为雌性
    		sex = 1;
    	}
    
    	// 重写了母鸡的叫唤方法
    	public void call() {
    		System.out.println("咯咯咯");
    	}
    }
    

    最后在外部创建一个Chicken鸡类的实例,先将公鸡实例赋值给这个鸡类实例chicken,紧接着调用chicken的call方法;再将母鸡实例赋值给鸡类实例chicken,紧接着调用chicken的call方法。按此步骤编写的测试调用代码见下:

    //演示类的多态性
    public class TestChicken {
    
    	public static void main(String[] args) {
    		// 鸡类的实例变成了一只公鸡
    		Chicken chicken = new Cock();
    		// 此时鸡类的叫声就变为公鸡的叫声
    		chicken.call();
    		// 鸡类的实例变成了一只母鸡
    		chicken = new Hen();
    		// 此时鸡类的叫声就变为母鸡的叫声
    		chicken.call();
    	}
    }
    

    运行以上的测试代码,观察到以下的日志信息:

    喔喔喔
    咯咯咯
    

    由日志结果可见,尽管chicken本来是鸡类的实例,然而两次调用chicken的call方法,却没有输出鸡类的叫声,而是先后打印了公鸡类的叫声和母鸡类的叫声。这个现象便是多态特性的一个实际运用,所谓多态,意思是有多种状态,好比古人的卸甲归田,穿上盔甲去打仗就是士兵,卸下盔甲去种田就是农民。多态的实现依赖于继承,先声明一个父类的实例,再于合适之时给它分别赋予不同的子类实例,此后操作该实例就仿佛操作子类的实例一般。
    引入多态概念的好处是,只要某些类型都从同一个父类派生而来,就能在方法内部把它们当作同一种类型来处理,而无需区分具体的类型。仍以鸡叫为例,不管是公鸡叫还是母鸡叫,都是某种鸡在叫,于是完全可以定义一个叫唤方法,根据输入的鸡参数,让这只鸡自己去叫即可。叫唤方法的具体代码如下所示:

    	// 定义一个叫唤方法,传入什么鸡,就让什么鸡叫
    	private static void call(Chicken chicken) {
    		chicken.call();
    	}
    

    这下有了通用的鸡叫方法,外部就能把鸡类的实例作为输入参数填进去。当输入参数为公鸡实例的时候,call方法上演的是公鸡喔喔叫;当输入参数为母鸡实例的时候,call方法上演的是母鸡咯咯叫。

    		call(new Cock()); // 公鸡叫
    		call(new Hen()); // 母鸡叫
    

      

    更多Java技术文章参见《Java开发笔记(序)章节目录

  • 相关阅读:
    用SQL实现的一个自动排课机制
    如何读懂复杂的C声明
    Mingw32配置
    test
    HttpSession API
    java程序逻辑控制
    方法的定义及使用
    memcached 安装及集成(转)
    cookie和session的的区别以及使用示例?
    构造方法和普通方法的区别?
  • 原文地址:https://www.cnblogs.com/pinlantu/p/10297534.html
Copyright © 2011-2022 走看看