1.调用成员的特点
变量调用:编译看左边,运行也看左边
方法调用:编译看左边,运行看右边
//动物类
class Animal{
String name="动物"; public void show(){ System.out.println("动物---show方法"); } } //狗类 class Dog extends Animal{ String name="狗"; @Override public void show(){ System.out.println("狗---show方法"); } } //猫类 class Cat extends Animal{ String name="猫"; @Override public void show(){ System.out.println("猫---show方法"); } }
//测试类
public class Test {
public static void main(String[] args) { Animal a=new Dog(); System.out.println(a.name); a.show(); } }
测试类打印结果为"动物",a.show();方法调用打印"狗"。
总结:Father f = new Son();
f的成员变量看Father,f的成员方法看Son。
2.多态的优势
①业务逻辑方式改变时,便于修改。例如,一开始是创建学生的对象工作
Person p=new Student();
p.work();
之后想创建教师的对象工作,
Person p=new Teacher();
p.work();
因为调用方法看右边,所以p.work会使用Teacher类的方法。
②如果Person类有很多种子类,创建对象时可以Person p=New Son1(),Person p=New Son2(),Person p=New Son3()……不用所有子类都写一遍统一用Person就好。
3.多态的弊端
Person p=new Student()
p无法调用Student特有的方法。例如Person类中有eat,sleep方法。Student类中有eat,sleep,study方法。那么p.study()就无法调用。
解决办法:类型转换
Student s=(Student) p;
s.study();
4.总结