多态:父类的引用指向了子类的对象,多态必须存在继承或实现。
类似:Father f = new Son();
使用多态需要注意:
1.子父类存在同名的成员变量时,访问的是父类的成员变量。
2.子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
3.子父类存在同名的静态成员函数时,访问的是父类的成员函数。
4.父类不能访问子类的特有成员函数和成员变量。(向上转型导致丢失)。(编译看左边,运行不一定看右边)
编译看左边,java编译器在编译的时候,先检查左边的引用是否具备有需要执行的成员变量和成员函数,如果不存在,马上报错。
java一般都是后期绑定(又称动态绑定或运行时绑定,java中除了static和final(private 方法属于final方法)外都是后期绑定,通常java虚拟机后期绑定都是自动发生的,final方法一方方面是不允许重写和修改,最重要的一点就是防止后期绑定),但是static静态的变量在编译时就已经进行了绑定,也就是前期绑定。
多态成果:同样的父类类型可以指向不同的子类引用,导致我们在涉及方法时,参数可以设置为父类类型,使当前父类指向不同的子类,使得方法可以根据不同的子类实现,表现出不同的执行结果。
有点:解耦合,方便方法重用,可扩展性强。
缺点:如果子类指向了父类,子类的特有成员变量和方法会被窄化,需要类型强制转换后才能再使用;匿名内部类使用多态,如果想使用特有成员,需要转换为非匿名内部类。