Java特性之多态详解

多态

extends继承或者implements实现,是多态性的前提。

  • 解释:李华是一个学生,同时也是一个人。多态是相对于对象说的,不是对于类说的。一个对象拥有多种形态,这就是:对象的多态性

多态的格式与使用

代码中体现多态性,一句话来说,就是父类指向子类对象。
父类名称 对象名 = new 子类名称()
“左父右子”即体现了多态性

接口名称 对象名 = new 实现类名称()

多态中成员变量的使用特点

温习:
访问成员变量的两种方式:

  1. 直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。成员变量不可以覆盖重写
  2. 间接通过成员方法访问,看该方法属于谁,优先用谁,没有则向上找。子类覆盖重写了就用子类,没有覆盖重写,就用父类

多态中成员方法的使用特点

  • 看new的是谁,就优先用谁,没有则向上找。
  • 口诀:编译看左边,运行看右边。
  • eg:
Fu obj = new Zi();
obj.method();//父子都有,则优先用子;
obj.methodFu();//子类没有,父类有,向上找到父类。
obj.methodZi();//错误写法!编译看左边,左边为Fu,没有methodZ i方法,所以报错;

小结

成员变量:编译看左边,运行还看左边;
成员方法:编译看左边,运行看右边。

多态的好处

假设现在创建一个员工类,然后extends或者implements一个讲师类或者助教类,
如果不用多态,只用子类来写,写法是:

//work()是继承下来的方法;
Teacher one = new Teacher();
one.work();//讲课
Assistant two = new Assistant();
two.work();//辅导

如果使用了多态,可以对比一下

Employee one = new Teacher();
one.work();//讲课
Employee two = new Assistant();
two.work();//辅导

所以好处是:使用了多态,,无论右边new哪个子类对象,等号左边调用方法都不会发生变化。
使用面向对象的思维举例:老板不需要关心工作是谁去做的,对于老板来说,都是员工去做的。

对象的向上转型

  • 对象的向上转型,其实就是多态写法:
  • 格式:父类名称 对象名 = new 子类名称();
  • 含义:右侧创建一个子类对象,把它当作父类来看待使用。
  • 注意事项:向上转型一定是安全的,因为是从小范围转向了大范围。(可以类比为int–>double,自动类型转换)

对象的向下转型

  • 首先不要望文生义,所谓向下转型不是真的能直接“向下转型”,父类不能直接调用子类的特有内容(即不是继承自父类的特有内容)。所谓“向下转型”,是指对象向上转型为父类使用后,用对象的向下转型“还原”;
  • 格式:子类名称 对象名 = (子类名称)父类对象//()的用法有点像强制类型转换的意思;
  • 注意事项:
    1. 必须保证对象原来创建的时候和向下转型的类型一样;
    2. 如果对象创建时与向下转型时的类型不一样(eg:如cat向上成为animal,向下转型却转为了dog)就会报错,ClassCastException,类转换异常。

怎样获取一个父类引用的对象本来是什么子类?(instanceof)

  • 格式:
    • 对象 instanceof 类名称
    • 这将会得到一个Boolean值结果,来显示判断前面的对象能不能当做后面类型的实例。
  • eg:

public staic void test(Animal animal){
   if(animal instanceof Dog){
    Dog.dog = (Dog) animal;
    dog.xxx();
   }
}

猜你喜欢

转载自blog.csdn.net/weixin_41121063/article/details/87997011