面对对象
面对对象的一些标准
- 考虑可复用和可修改性
- 继承
- 多态:一会是父类一会是子类
- 动态调度/绑定
有关对象:
- 对象是一组状态和行为
- 状态:通过数据来表示
- 行为:通过方法实现
在JAVA中,一个类是这样的
静态与实例:
静态方法不与类的任何特定实例关联,所以,静态方法不能调用非静态成员与方法(需要实例化)
接口
- Java中接口是一个记号,而不是方法本体
- 接口被声明它的类实现
- 一个接口可以扩展(extend)其他接口
- 一个类可以实现多个接口
接口不能有构造函数,不过我们可以使用一个静态的隐式构造函数
使用接口的好处有:
- 调用者理解ADT时只需要理解接口即可
- 方便不同实现可
- 避免客户机不能在ADT的表示上无意间创建依赖项,因为实例变量根本不能放在接口中
- 抽象数据类型的多个不同表示可以共存于同一个程序中,作为实现接口的不同类
那么多次实现的好处在于?
- 有不同性能
- 提供不同行为
封装与信息隐藏
信息隐藏
好的设计通常会隐藏其内部实现细节以及内部数据,API实现分离,模块间只通过API通讯。
-
分离组成系统的类
- 允许开发、测试、优化、使用、理解和单独修改
-
加快系统开发
- 可以并行开发类
-
减轻维护负担
- 可以更快地理解课程并调试,而无需担心伤害其他模块
-
实现有效的性能调整
- “热”类可以单独优化
-
增加软件复用性
- 低耦合类通常在其他上下文中被证明是有用的
显然,使用接口可以很好地满足以上问题。
对于普通类,为了防止泄露,修饰符的重要性就体现出来了:
继承与重写
重写:子类重新实现父类中的方法,根据调用时的对象类型决定被调用方法的版本(java不支持多重继承的好处)
在默认情况下父类中的方法均是可被重写的,但是可以用final来限制重载.
子类中可以通过super关键字调用父类中被重写的方法
重写需要保证的是:
- 签名保持一致
- 使用@Override(这样IDE会帮你检测)
- 限制符可以增加但是不能减少
抽象类:是有抽象函数的类
抽象类不能实例化,且继承某个抽象类的子类在实例化时,所有父类中的抽象方法必须已经实现
多态
多态性是指为不同类型的实体提供一个接口,或者使用一个符号来表示多个不同的类型
包括:
- 一个函数可以有多个同名的实现(方法重载)
- 一个类型名字可以代表多个类型(泛型编程)
- 一个变量名字可以代表多个类的实例(子类型)
重载:重载是指在一个类中存在多个同名函数,必须具有不同的参数列表,返回值类型可同可不同
与重写的区别
泛型
泛型类是指类中如果声明了一个或多个泛型变量,则为泛型类。泛型类/接口,是在实例化类的时候指明泛型的具体类型(类型擦除);
泛型方法,是在调用方法的时候指明泛型的具体类型
静态方法不能使用所在泛型类定义的泛型变量,如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法
继承与子类
Java中的子类型一定要确保其规格说明不弱于超类型
客户端可以对不同类型的对象使用统一的方式进行处理(处理超类型)
类型强转:
避免向下类型转换
instanceof操作符可以用来检测类名相同否
Java Object中的一些函数
- equals() – true if the two objects are “equal”
- hashCode() – a hash code for use in hash maps
- toString() – a printable string representation