面向对象编程有三个特征,即封装、继承和多态。
概念
封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。
继承是为了重用父类代码,同时为实现多态性作准备。
多态是该对象自行决定响应何种行为,由方法的重写、重载与动态连接构成。
重写Override: 函数签名相同,行为不同。
重载Overload: 函数签名不同。
总结
- 可以使用父类类型的引用指向子类的对象,但是不能把父类对象引用赋给子类对象引用变量。
除非我们自己定义强制进行向下转型。 - 该引用只能调用父类中定义的方法和变量,
假若调用了一个只在子类定义的方法(在父类中并没有定义),则会出错。 - 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,
将会调用子类中的这个方法。(动态连接、动态调用) - 变量不能被重写(覆盖),”重写”的概念只针对方法。
如果在子类中”重写“了父类中的变量,那么在编译时会报错。
原因:
C++允许多继承,功能强大,但有高风险。Java只允许单继承,所以引入多态,增强功能。
向上转型
避免每添加一个新类,都要大量重新编码。
Animal a = new Cat();
定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
绑定
早期绑定
将一个方法调用同一个方法主体连接到一起就称为“绑定”(Binding)。
若在程序运行以前执行绑定(由编译器和链接程序,如果有的话),就叫作“早期绑定”。此时,程序不知道该调用哪个子类的方法。
后期绑定
绑定在运行期间进行,以对象的类型为基础。
Java中绑定的所有方法都采用后期绑定技术,除非一个方法已被声明成final。