面向对象三大特性:

封装性:
体现程序安全
继承性:
体现程序的复用性 扩展性
多态性:十分重点!!!
事物的多种状态
java中: 方法的重载,方法的覆写

对象的多种状态:对象多态性

声明父类new子类 将子类的引用赋值给父类对象

对象多态的使用:

  1. **声明父类new子类对象,编译时是父类对象,实际运行起来是子类对象**<br /> **所以: 编译器看左边,运行时看右边**

对象多态的作用:

**灵活性和扩展性的体现:**<br />**参数声明的如果是父类,那么可以传入所有该父类的子类对象,**<br />**这就是多态性的最好体现**<br />    **不用再去重载一堆方法  只需要一个方法声明父类 **<br />**就可以传入所有子类对象**<br />**    提高了程序的灵活性和扩展性**<br />         **返回值声明父类型 可以返回任意子类对象**

优点:

提高了程序的灵活性,扩展性,代码的复用率(因为有继承的存在)

限制:

**必须有继承关系**<br />    编译期看左边,运行时看右边**---->编译期只能调用父类已经声明的成员,不能调用子类特有的成员**<br />        Dog dog=new Dog();<br />        Animal ani1=dog;<br />        **必须要存在方法的覆写,如果不覆写呢?**<br />    **就会调用父类的方法**<br />**            那么多态性声明父类new子类干嘛呢?**<br />        **如果子类不覆写父类方法 那么调用的是父类的**<br />        那么声明父类new父类不就好了么<br />            Animal ani1=new Dog();<br />            Dog d=(Dog) ani1;

下面两个绑定表示我们的方法和属性到底调用是子类还是父类需要通过绑定来判断

动态绑定(运行时绑定):

    **调用子类的**<br />**        调用: 调用的都是被子类覆写普通方法**

静态绑定(编译期绑定):

绑定的都是父类对象,所以调用的都是父类的<br />    父类的属性,父类用static/final/private修饰的方法<br />       **父类:static修饰的方法 无法被覆写**<br />**        final修饰的方法 无法被覆写**<br />**        private修饰的方法 无法被覆写**

补充:

方法的覆写,如果父类方法是静态的,那么子类覆写也要是静态,
但不是真正的覆写 (静态只能覆盖静态,但不是真正的覆盖)

基本数据类型存在类型转换

         小类型--->大类型  自动类型转换<br />             大类型---->小类型  强制类型转换

类型转换:

子类对象赋值给父类对象 子类—->父类 image.png
向上转型 自动类型转换
父类对象赋值给子类对象 父类—->子类
向下转型 强制类型转换
image.png
ClassCastException 类型转换异常
当尝试将一个对象 强转成 非子类型对象时 抛出该异常

instanceof关键字:

判断一个对象运行时!!!是否是一个类的对象<br />    对象名 instanceof 类名<br />    是返回true 不是返回false