多态

一、

多态:父类的引用指向了子类的对象

父类                   子类
Person p = new Man();   编译期间看到是 p 是Person 类型的,所以只能调用Person类中的结构

  • 我们在编译期,只能调用父类声明过的方法,但执行的是子类中重写的方法 ---虚拟方法调用
  • 总结 :编译看左边,运行看右边
  • 多态性的使用前提:1.类的继承 2.子类重写父类的方法
  • 使用举例:在方法中,形参是父类类型,传进去的实参是子类类型
  • 多态性不适用于属性,编译和运行都看左边
  • 多态性是运行时行为,只有在运行时候才知道确定是类型是什么,在编译时只需要声明为父类的就行了

二、

那么,我们如果想要调用Man中特有的结构,该怎么办呢?

我们需要向下转型!!         Man m = (Man) p;

这时编译期间看到的 m 是 Man 类型的 , 就可以调用Man中特有的结构了 。

 

那么我们来想想,既然 p 可以转成 Man类型的 , 是否也可以转成其他子类类型呢? 比如 Woman w = (Woman)p;

答案是:在编译期间不会报错,但是一运行就报错了。

 

那么我们该如何来避免这种错误的情况发生呢?

我们需要使用 instanceof 关键字来进行判断!

三、

instanceof关键字的使用

if(p instanceof Man){

  Man m = (Man)p

}

 

posted @ 2022-03-27 20:25  陈浩威  阅读(47)  评论(0)    收藏  举报