多态存在的三个必要条件:继承,重写,父类引用指向子类对象
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误,如果有再调用子类的同名方法。
多态的优点:1.可以使程序有良好的扩展。2.对所有类的对象有通用的处理。
明明调用的是父类对象的方法,为什么运行时却调用子类对象的方法呢?
编译类型:对象在编译后文件里的类型也就是对象的声明类型
运行类型:对象在程序运行时动态指定的类型也就是该对象定义类型
如果编译类型和与运行类型不一致就会发生运行时的动态绑定
静态绑定:在编译时就知道这个方法是哪个类中的对象
java当中的方法只有final、static、private修饰的的方法和构造方法是静态绑定的
因为静态绑定无法被覆盖,所以将始终由某个本地类的对像调用
private修饰的方法:private修饰的方法是不能被继承的,因此子类无法访问父类中private修饰的方法。所以只能通过父类对象来调用该方法体。因此可以说private方法和定义这个方法的类绑定在了一起。
final修饰的方法:可以被子类继承,但是不能被子类重写(覆盖),所以在子类中调用的实际是父类中定义的final方法。(使用final修饰方法的两个好处:(1)防止方法被覆盖;(2)关闭java中的动态绑定)。final的作用:final修饰的类不可以被继承;final修饰的方法不能被重写;final修饰的变量不能被修改
static修饰的方法:可以被子类继承,但是不能被子类重写(覆盖),但是可以被子类隐藏。(这里意思是如果父类里有一个static方法,它的子类里如果没有对应的方法,那么当子类对象调用这个方法时就会使用父类中的方法,而如果子类中定义了相同的方法,则会调用子类中定义的方法,唯一的不同就是:当子类对象向上类型转换为父类对象时,不论子类中有没有定义这个静态方法,该对象都会使用父类中的静态方法,因此这里说静态方法可以被隐藏而不能被覆盖。这与子类隐藏父类中的成员变量是一样的。隐藏和覆盖的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏的变量和方法,而不能访问父类被覆盖的方法)。
构造方法:构造方法也是不能被继承的(因为子类是通过super方法调用父类的构造函数,或者是jvm自动调用父类的默认构造方法),因此编译时也可以知道这个构造方法方法到底是属于哪个类的。
在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。