网站建设修改建议书,wordpress 注释模版,最好用的网站推广经验,互联网建设与管理【0】RAEDME
0.1#xff09;本文总结于 core java volume 1#xff0c; 感觉多态中存在的这个问题很新颖#xff0c;故分享之#xff1b; 【1】继承与is-a法则
1.1#xff09;有一个用来判断是否应该设计为继承关系的规则#xff1a; 这就是 is-a 规则#xff0c; 它…【0】RAEDME
0.1本文总结于 core java volume 1 感觉多态中存在的这个问题很新颖故分享之 【1】继承与is-a法则
1.1有一个用来判断是否应该设计为继承关系的规则 这就是 is-a 规则 它表明子类的每个对象也是超类的对象 1.2is-a法则 is-a 法则 的另一种表述法是 置换法则 它表明程序中出现超类对象的任何地方都可以用子类对象置换 如 可以将子类的对象赋给超类变量
Employee e;
e new Employee();
e new Manager(); 【2】多态
2.1多态定义 在java中 对象变量是多态 的 一个 Employee变量既可以引用一个 Employee 类对象也可以引用一个 Employee 类的 任何子类对象 2.2从以下代码就可以看出 置换法则的优点
Manager boss new Manager(......);
Employee[] staff new Employee[3];
staff[0] boss;
staff[1] new Employee(tangtang, 1, 2, 3, 4);
staff[2] new Employee(rongrong, 4, 3, 2, 1);
2.3在上面的代码中 变量 staff[0] 和 boss 引用同一个对象 但编译器将 staff[0] 看做是 Employee对象 2.4这意味着 可以这样调用 boss.setBonus(…) 但是不可以这么调用 staff[0].setBonus(……); 这是因为 staff[0] 声明的类型是 Employee 而setBonus 不是 Employee 类的方法 2.5也不能将一个超类的引用赋给子类变量下面的赋值是非法的 Manager m staff[i]; 非法原因很清楚 不是所有的雇员都是经理 Alert 在java中 子类数组的引用可以转换成超类数组的引用 而不需要采用强制类型转换 如下面是一个经理数组
Manager[] managers new Manager[10];
将它转换为 Employee 数组是完全合法的
Employee[] staff managers; 【3】java多态机制存在的问题很隐秘 这个问题
3.1这样做后存在的问题切记 managers 和 staff 引用的是同一个数组 如 staff[0] new Employee(“XiaoTang”, ……) 编译器竟然接纳了这个赋值操作。但这里 staff[0] 和 managers[0] 引用的是同一个对象 似乎我们把一个普通员工归入经理的行列了 这是一种很忌讳发生的事情当调用 managers[0].setBonus(10000)的时候 将会导致调用一个不存在的实例域 进而搅乱相邻存储空间的内容 3.2为了确保不发生这类错误 所有数组都要牢记创建它们的元素类型并负责监督仅将类型兼容的引用存储到数组中