【面向对象】多态,转型,成员特点

多态

  • 含义
    多态在函数和对象上都有体现,函数的重载和复写即多态的体现形式之一,此时,接收同样的消息产生不同的行为即多态;而对象上的多态主要指同一事物具有多种表现形态,如猫狗既可以叫它们猫狗又可以叫它们动物,其实这里的多态就是描述对象的抽象层次的差别。
  • 应用
    多态的主要应用是简化程序代码,提高程序扩展性。具体来讲,子类复写了父类方法后,通过子类对象赋给父类,父类引用调用子父类同名方法,运行的将是子类复写的行为,父类方法干的却是子类的事,对于在事先不知道或者不确定具体应该运行那个对象的方法的情况下,行为一样,即干的同样的事,但对象在变动,在这样的需求下,传入变动对象的共同父类引用将大大简化代码。但这种情况下父类引用只能调用父类中定义过的属性,想要调用子类的特有属性,就要涉及转型的概念。

转型

就是类型转换,根据转换方向分成上转型和下转型:

  • 上转型:向上转型,父类的抽象层次是高于子类的,把new的子类对象赋值给父类类型的应用,就叫上转型,此时,new了一个子类对象本应赋给子类型的应用,却付给了父类引用,所以这个应用就失去了调用子类特有属性的权利,只能调用父类定义的属性,也是子父类的公共属性。上转型就像是给子类对象穿了父类的马甲,让他被编译器识别为父类,但干活时还是用的自己的方式干。这也可以解释此时的父类引用只能调父类中定义的方法。
  • 下转型:承接上转型,我new了一个子类对象传给父类引用,但我子类定义的特有属性却用不成了,所以在想要用子类的特有属性的需求下,进行下转型,将父类引用强制类型转化为子类型,子类成员就完全可以用了。但转型的前提是对象本身是子类对象才能完成转型,这就像父类引用的去马甲过程,本来是子类的对象,穿上父类的马甲,现在去掉马甲,完全变成子类对象。
  • 除此以外的赋值,转型方式都是错误的,不能new了父类对象,赋给子类引用,也不能把子类对象强转成其他子类类型,道理也很容易想,一个子类不能代表父类,不能说动物就是猫,同样,一个子类也不能变成另一个子类,猫变不成狗。

成员特点

类型 引用名 = new 类型();

  • 成员变量
    编译看左边,运行看左边
    不过右边是什么对象,左边什么类型,变量调用时就会在左边的类找值
  • 成员方法
    编译看左边,运行看右边
    编译时,左边的类型决定编译是否出错,在左边类里找得到方法,则正确,否者编译出错。
    运行时,右边new了什么对象就去对象对应的类找方法,找得到就运行,找不到就去父类找,否则报错。
  • 静态成员方法
    静态绑定,不同于普通成员变量和方法,静态成员方法只跟类名有关系,无论编译还是运行,看的都是左边
    上述特点都是由对象创建的内存结构决定,对象的内存结构可以解释这些特点。
    【面向对象】多态,转型,成员特点
    继承时,子类会继承父类属性,但访问修饰符(private等)使父类的一些属性不可见,在创建子类对象赋值给父类引用时,引用指向了子类对象,调用成员变量,找的是子类中父类的num,调用方法时,先找子类,没有找父类。