章节引入:ADT的具体实现技术:OOP、类、接口
主要内容:OOP的基本概念、多态性、Object类中的方法、好的类的设计
基本概念
object对象:含状态(filed)和行为(method)
class类:类是一种模板,可用于产生新的实例对象,类中的方法是method
注:object是真实存在的对象,class是对个体的抽象概括,并不真实存在
抽象:类方法\变量的调用——类名称.类变量\方法名——用static定义
具体:实例方法\变量的调用——需要创建对象\实例化,实例名.实例变量\方法名——无static
注:System.out.println(x)是类方法,类名是System,底层默认调用x的toString方法
静态方法只能调用静态成员,非静态方法可以调用实例化\静态成员
对静态成员,虚拟机在加载时就会在内存中生成相关对象,因此可以直接使用类名调用
对实例化成员,必须自己new一个实例
接口
接口中只有方法的定义,没有实现;
接口之间可以继承与扩展;
一个类可以实现多种接口,调用多种接口中的方法(java不支持多继承的补偿);
一个接口可以有多个实现类(List的ArrayList和LinkedList)(implement,要实现接口中所有方法,静态检查,可以增加方法)
接口确定ADT规约,类实现ADT,较好的设计还是先用接口再用类
接口中不能有构造器,无法保证所有实现都包含了构造器,用户需要中的接口某个具体实现类的名字,封装不彻底,应该在接口中定义一个静态方法实现彻底封装。
使用default,在接口实现某些共同的功能,在子类型中可以被覆盖
信息隐藏
好处:过程解耦,有利于测试、开发、使用;可并行开发,提高开发速度;能更好的定位错误;易于实现性能优化和代码复用
方法:用四种可见性控制接口加类
继承和重写overriding
继承分为严格继承(子类只能添加新方法不能重写父类中的方法)和非严格继承(可以重写)
A final field : prevents reassignment to the field after initializationA final method : prevents overriding the methodA final class : prevents extending the class
重写:方法签名完全相同,实际执行时调用哪个方法需要虚拟机在running时根据对象的类型确定
重写之后,在子类方法内可以用super关键字调用父类中的对应方法
要使用@Override强制编译器检查覆盖方法的签名是否一致
子类中重写的方法的可见性要与父类型一致或更加宽泛
抽象程度减弱:接口->抽象类->普通类
抽象类不能实例化(不能用new生成对象) ,继承某个抽象类的子类在实例化时,所有父类中的抽象方法必须已经实现
多态
特殊多态(重载overloading)一个方法可以有多个同名的实现
要求名字相同但参数列表不同,执行静态类型检查,在编译阶段决定具体执行哪个方法
易错习题(必考题)
重载与重写的区别(考试重难点)
参数化多态(泛型编程)一个类型名字可以代表多个类型
在运行时会被具体指定为某个数据类型,在运行时是没有泛型L的
泛型类:运行时共享一个类 class ClassName <T,E,...>{}
泛型接口:运行时共享一个接口 interface InterfaceName <T,E,...>{}
实现时可以使用非泛型或泛型的实现类
泛型方法:public <T> T Method(){}
通配符<?> <? extends Class> <? super Class>
子类型多态 一个变量名字可以代表多个类的实例
B是A的子类型\B可以替代A:要求B的规约不弱于A,A中的每个方法在B中都有实现且兼容
好处:不同类型的对象可以统一处理而无需区分,实现了很好的隔离
Object类中的方法
equals()不重写判断内存空间是否相同
hashCode()只对涉及到hash算法的有用
toString()缺省打印内存空间地址
类的设计
尽量设计不可变类,方法如下:
▪ Don’t provide any mutators▪ Ensure that no methods may be overridden▪ Make all fields final▪ Make all fields private▪ Ensure security of any mutable components (avoid rep exposure)▪ Implement toString(), hashCode(), clone(), equals(), etc
必须设计可变类:状态一定会发生变化(现实世界、抽象如迭代器、进程类)
可变类要尽可能减小可变性