多态:
体现:父类的引用指向了子类的对象。
基本操作思想:以前创建本类对象,调用该对象的方法,指挥对象做事情,可是当对象太多是,指挥变的很麻烦。
可以找到这些对象的共性类型,对这些共性类型进行操作,这样可以把复杂的事情简单化
前提:类与类之间必须有关系,要么继承,要么实现。
一般都会有覆盖动作。
好处:提高了程序的扩展性。
后期派生出来的子类的功能内容可以被前期所写的代码使用。
局限性:只能使用子类覆盖父类中的功能,子类的特有功能,不能使用。
例子:
Animal a = new Cat(); // 类型(引用型)提升。向上转型。
a 只能用Animal中的方法。
Cat c = (Cat)a; // 向下转型。
c 即可用Animal中的方法,也可以用Cat中的方法。
Dog d=(Dog)a; // 类型转换异常
向下转型:当需要调用到子类的特有数据时。
向上转型:当只使用子类覆盖父类功能的功能,不使用子类特有功能时。(强制转换异常)
例子:
毕姥爷 x = new 毕老师();
x.讲课();// 调用的是(子类)毕老师的讲课功能
毕老师 y = (毕老师)x;
y.看电影();// 调用的是(子类)毕老师的看电影功能。
判断应用型对象所属类型:用 instanceof
(对象名 instanceof 引用类型) 返回boolean类型值
判断子类型,强转父类型
(面试)
多态出现后,调用子类成员的特点:
1, 成员变量:
编译运行看左边。
2, 成员函数:
编译看左边、运行看右边
(所属于对象)
3, 静态函数:
编译运行看左边
静态方法是绑定在所属的类上的,所以他只参考引用变量所属的类。
例子:
Fu f = new Zi ();
f.num = 2; // 给父类变量num赋值 ,引用谁,调用谁。
f.method() ;// 调用时,编译检查父类是否有method()函数,运行调用子类中的method方法
// 如果method()方法是静态的,调用的是父类的method()方法。
因为静态方法绑定在所属的类上。
|