• 【面向对象核心】动态绑定和多态


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

    如下例子中,根据  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();
    	}
    }
    

     内存分析图

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

  • 相关阅读:
    网络测量中基于Sketch方法的简单介绍
    Reading SBAR SDN flow-Based monitoring and Application Recognition
    Reading Meticulous Measurement of Control Packets in SDN
    Reading SketchVisor Robust Network Measurement for Sofeware Packet Processing
    ovs加dpdk在日志中查看更多运行细节的方法
    后缀数组
    (转载)LCA问题的Tarjan算法
    Codeforces Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) A. Checking the Calendar(水题)
    Vijos 1816统计数字(计数排序)
    卡特兰数
  • 原文地址:https://www.cnblogs.com/lsswudi/p/11269324.html
Copyright © 2020-2023  润新知