zoukankan      html  css  js  c++  java
  • 【面向对象核心】动态绑定和多态

    动态绑定是指在“执行期间”,而非在编译期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

    如下例子中,根据  lady    对象    的成员变量       pet       所引用的不同的实际类型而调用相应的enjoy()方法

    三条规则:

    1.要有继承

    2.要有方法的重写

    3.父类引用指向子类对象

    多态是同一个行为具有多个不同表现形式或形态的能力。

    多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:

    多态性是对象多种表现形式的体现。

    现实中,比如我们按下 F1 键这个动作:

    • 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
    • 如果当前在 Word 下弹出的就是 Word 帮助;
    • 在 Windows 下弹出的就是 Windows 帮助和支持。

    同一个事件发生在不同的对象上会产生不同的结果。

    多态的优点

    • 1. 消除类型之间的耦合关系
    • 2. 可替换性
    • 3. 可扩充性
    • 4. 接口性
    • 5. 灵活性
    • 6. 简化性

    多态存在的三个必要条件

    • 继承
    • 重写
    • 父类引用指向子类对象

    比如:

    Parent p = new Child();
    //定义Animal类
    class Animal {
    	private String name;
    	Animal(String name) {
    		this.name = name;
    	}
    	
    	public void enjoy() {
    		System.out.println("动物叫声........");
    	}
    	//public abstract void enjoy();
    }
    
    class Cat extends Animal {
    	private String eyesColor;
    	Cat(String n,String c) {super(n); eyesColor = c;}
    	public void enjoy() {
    		System.out.println("喵喵喵............");
    	}
    }
    
    class Dog extends Animal {
    	private String furColor;
    	Dog(String n,String c) {super(n); furColor = c; }
    	public void enjoy() {
    		System.out.println("汪汪汪............");
    	}
    }
    
    class Bird extends Animal {
    	Bird() {
    		super("bird");
    	}
    	public void enjoy() {
    		System.out.println("叽叽喳喳..........");
    	}
    }
    
    
    class Lady {
    	private String name;
    	private Animal pet;   //定义Animal类型的pet
    	Lady(String name,Animal pet) {
    		this.name = name; this.pet = pet;
    	}
    	public void myPetEnjoy() {pet.enjoy();}
    
    }
    
    
    
    
    public class Test {
    	public static void main(String args[]) {
    		Animal a = new Animal("dongwu");
    		Cat c = new Cat("catname","blue");
    		Dog d = new Dog("dogname","black");
    		Bird b = new Bird();
    		
    		Lady l1 = new Lady("l1",c);
    		Lady l2 = new Lady("l2",d);
    		Lady l3 = new Lady("l3",b);
    		Lady l4 = new Lady("l4",a);
    		
    		l1.myPetEnjoy();
    		l2.myPetEnjoy();
    		l3.myPetEnjoy();
    		l4.myPetEnjoy();
    	}
    }
    

     内存分析图

     而向下转型可以弥补不能使用子类的功能的缺点

  • 相关阅读:
    selenium基础(鼠标和键盘事件)
    Java:面向对象三大特征
    Java:面向对象(上)
    Java:数组
    Java:方法
    Java基础:程序结构控制
    Java基础:用户交互Scanner
    Java基础语法(下)
    Jenkins(Extended E-mail Notification)邮箱配置正确但是并没有发送邮件
    接口自动化测试与Jenkins集成(Freestyle project任务版)
  • 原文地址:https://www.cnblogs.com/lsswudi/p/11269324.html
Copyright © 2011-2022 走看看