抽象类和接口
- 抽象类
- 不能创建abstrac类的实例
- 可以创建变量,类型是抽象类,并指向具体子类的一个实例
- 不能有抽象构造函数和抽象静态方法
- 子类实现抽象类的所有抽象方法
- 抽象类中可以有非抽象方法
- abstract不能与final并列修饰同一个类。
- abstract 不能与private、static、final或native并列修饰同一个方法
- 接口
- 抽象类的变体
- 接口中所有的方法不都是抽象的,用default修饰的方法就不是抽象的
- 只可以定义 static final成员变量,默认的,不写,它也就是static final修饰的。
- 实现类重写接口的未实现的方法,如果方法用default修饰的话,将不需要重写
- instanceof 运算符可以用来决定某对象的类是否实现了接口
Overload和Override
重载和重写是Java多态性的不同表现
- Overload 重载
- 如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
- Overloaded的方法是可以改变返回值的类型。
- Override 重写
- 在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)
- 重写方法后,原方法就被覆盖了,若要使用原方法,就需要调用super关键字来引用
- 子类访问修饰权限不能低于父类
final和finalize
- final
- 声明属性:属性不可变
- 声明方法:方法不可覆盖
- 声明类:类不可继承
- finalize
- Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法
- 可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
面向对象的特征
- 抽象
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。
抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。
抽象包括两个方面,一是过程抽象,二是数据抽象。
- 继承
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。
对象的一个新类可以从现有的类中派生,这个过程称为类继承。
新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。
派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
- 封装
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。
面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
- 多态
多态性是指允许不同类的对象对同一消息作出响应。
多态性包括参数化多态性和包含多态性。
多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
Object中的方法
内部类
- 静态内部类: 属于外部类,只加载一次。作用域仅在包内,可通过
外部类名.内部类名
直接访问,类内只能访问外部类所有静态属性和方法
。HashMap 的 Node 节点,ReentrantLock 中的 Sync 类,ArrayList 的 SubList 都是静态内部类。内部类中还可以定义内部类
,如 ThreadLoacl 静态内部类 ThreadLoaclMap 中定义了内部类 Entry。 - 成员内部类: 属于外部类的每个对象,随对象一起加载。
不可以定义静态成员和方法,可访问外部类的所有内容。
- 局部内部类:
定义在方法内,不能声明访问修饰符,只能定义实例成员变量和实例方法,作用范围仅在声明类的代码块中。
- 匿名内部类: 只用一次的没有名字的类,可以简化代码,
创建的对象类型相当于 new 的类的子类类型
。用于实现事件监听和其他回调。
子类初始化的顺序
- 父类静态代码块和静态变量。
- 子类静态代码块和静态变量。
- 父类普通代码块和普通变量。
- 父类构造方法。
- 子类普通代码块和普通变量。
- 子类构造方法。
List、Map、Set
- List以特定索引来存取元素,可以有重复元素,继承Collection接口
- Set不能存放重复元素(用对象的equals()方法来区分元素是否重复),继承Collection接口
- Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一;只允许存放一个key为null的键值对,如果有多个null-v键值对,保留最后一个。
- Set和Map容器都有基于哈希存储和排序树的两种实现版本
HashMap和Hashtable
- HashMap和Hashtable都实现了Map接口
- HashMap允许键和值是null,而Hashtable不允许键或者值是null。
- Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
- HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。