1.抽象类(标志:abstract)
定义:有抽象方法的类,就必须声明为抽象类,也是一个类
抽象方法:没有方法体
作用:它是作为父类来使用的,是等待子类去实现的,提供一个模版让后代去实现的类,常用于需求分析和概要设计的时候
访问权限:抽象类是要被子类继承的,所以它的抽象方法只有public,protected,default三种访问权限,其他成员的访问权限和和类一样
抽象类:
- 可以有普通的成员变量和方法(static final 都行)
- 可以有常量
- 可以有构造方法(用来子类继承,必须被调用)
- 抽象方法可有可无
- 不能被实例化,因为没有使用方法
- 抽象类是用来被继承的
当一个类继承了一个抽象类时,必须要重写抽象类里面的抽象方法或继续定义为一个抽象类(抽象类和子类是is关系)
2.接口(标志:interface)
定义:是一种特殊的抽象,里面的方法都是抽象的
作用:对接口实现类起规范作用
访问权限:所有成员的属性都为public static final,也就是说接口中声明的变量都是常量,不能被继承;
所有方法的访问属性为public, 但一般为了代码的简洁性,接口类中的方法和属性不加 public。
接口:
- 不能有普通的成员变量与方法,final方法也不能有
- 可以存在常量(final可省,属性是个定值)
- 没有构造器,不能实例化
- 接口之间是可以继承的
- 一个类可以实现(implements)多个接口,实现了必须实现接口的所有方法。
- 接口是java单继承的有力扩展(java 可以单继承,多实现)
接口的优势:
- 标准化:只要接口定义了方法名,所有的实现类也就确定了,有一个标准化的作用
- 分工化:接口的方法可以直接被使用,具体的实现类对象赋值给接口就行了。
3.集合框架接口
集合之间的继承实现关系
父接口:collection
子接口:List (有序,可重复) , Set(无序,不重复)
1) collection接口
常用方法:
boolean add(Object o)添加对象到集合
boolean remove(Object o)删除指定的对象
int size()返回当前集合中元素的数量
boolean contains(Object o)查找集合中是否有指定的对象
boolean isEmpty()判断集合是否为空
Iterator iterator()返回一个迭代器
boolean containsAll(Collection c)查找集合中是否有集合c中的元素
boolean addAll(Collection c)将集合c中所有的元素添加给该集合
void clear()删除集合中所有元素
void removeAll(Collection c)从集合中删除c集合中也有的元素
void retainAll(Collection c)从集合中删除集合c中不包含的元素
Iterator:迭代器接口:对集合元素进行迭代
方法:hasNext():有元素可以迭代,返回true
next():返回迭代的下一个元素
1.1)List接口(有序的 可重复的接口)
常用的实现类:
ArrayList
:0.5倍的容量增长,读取元素的效率高,但删除的效率低
LinkedList
:删除元素效率高,读取效率低
vector
:线程安全的类 容量是1倍1倍的增长
List常用的方法:
void add(int index,Object element)在指定位置上添加一个对象
boolean addAll(int index,Collection c)将集合c的元素添加到指定的位置
Object get(int index)返回List中指定位置的元素
int indexOf(Object o)返回第一个出现元素o的位置.
Object remove(int index)删除指定位置的元素
Object set(int index,Object element)用元素element取代位置index上的元素,返回被取代的元素
void sort()
当List集合元素是基本类型和String时,直接使用sort() 方法,因为包装类和String都已经实现了comparable接口的conpareTo()方法。
当元素是自定义类的时候,对象是不能比较的,只有实现comparable接口(里面只有一个conpareTo()方法)才能进行比较,也就能使用sort()方法。
1.2)set接口(不重复的)
常用实现类:
HashSet
:无序
TreeSet
:有序,集合元素必须实现comparable接口才行,否则添加元素报错
2)Map接口(key相同的会进行覆盖)
map常用方法:
boolean equals(Object o)比较对象
boolean remove(Object o)删除一个对象
put(Object key,Object value)添加key和value
keySet()返回由key组成的set集合
entrySet()返回由元素组成的set集合
`Set<Map.Entry<String, Student>> set = map.entrySet();`
常用实现类:
Hashtable
: 任何非空(non-null)的对象。
HashMap
: 可空的对象,效率高,较常用。
3)总结
泛型:指定集合里面存放的数据类型
好处:提升安全性
减少强制类型转换(减少出错的几率)
提升运行性能
foreach(增强for循环):
for(数据类型 变量名:集合|数组){ }
jdk1.5以后的新特性:
- foreach
- 自动拆装包
- 可变参数
public static int add(int a,int b,int ...c){ int sun=a+b; for(int n:c)//c相当于数组 sun+=n; }
- 泛型
- 枚举
- 注解
List 和Set 的遍历:
List 可以是一般for循环 、foreach 、迭代器
Set可以是foreach 、迭代器
obj instanceof 类名|接口
判断一个对象是否是某个类的实例
- 如果涉及到堆栈,队列(先进后出)等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
- 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
- 要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
- 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
- ArrayList、HashSet/LinkedHashSet、PriorityQueue、LinkedList是线程不安全的,
可以使用synchronized关键字,或者类似下面的方法解决:
[java] view plain copy
List list = Collections.synchronizedList(new ArrayList(...));
网友评论