内部类
为什么
在JAVA 中每个内部类都能实现一种接口,这也是实现多态的一种方式。无论外部类是否已经实现了该接口,对内部类都毫无影响
普通内部类
内部类的最基本实现
实现普通的内部类非常简单:
class Outer {
private int i;
class Inner {
public set(int x){ i = x;}
}
}
内部类的特点
- 可以访问外部类的私有域及方法
- 可以继承接口
- 可以匿名声明
- 可以嵌套
关于内部类继承接口
内部类继承接口同外部类继承接口并无区别
interface Inner {
void set(int x);
}
class Outer{
class PInner implements Inner{
...
}
public PInner inner() { return new Inner();}
}
匿名声明内部类:
以下代码匿名声明了内部类,这个内部类实现了一个接口。
interface Inner {
void set(int x);
}
class Outer{
public Inner inner() {
return new Inner() {
poublic void set(int x){...}
}
}
}
事实上,上面的这两段代码作用并无区别,只是在调用方式上有所不同
// calling of 1st paragraph of code
// method one
Outer o = new Outer();
Outer.Inner i = o.new PInner();
// method two
Outer o = new Outer();
Outer.Inner i = o.inner(); // inner method required
// calling of 2nd paragraph of code
Outer o = new Outer();
Inner i = o.inner();
又事实上,第一段代码也实现了Inner接口,所以也能使用第二段代码的调用方式。
私有内部类
将成员类声明为私有,然后使用方法创建内部类:
class Outer{
private class PInner implements Inner{
...
}
public PInner inner() { return new Inner();}
}
嵌套类
什么是嵌套类
将内部类声明为static,则该类就变成了嵌套类。嵌套类不能引用外部类的变量,因为它为static,当引用外部类对象的时候,由于外部类并没有实例化故会报错。
对接口嵌套
内部类不仅可以作用于类,还能作用于接口,更有意思的是,内部类可以实现当前接口:
interface Inner {
void set(int x);
class PIner implements Inner{
void set(int x){...}
}
}
为什么没有 static 和 public ?
由于接口里面的声明的方法都是默认为 static以及 public 的,所以无需再次作声明
JAVA 的持有对象
持有对象,holding,是java的泛型容器。 泛型容器大致可以分为两种,分别是 Collection 和 Map
Collection下面派生了 Set/List 相关的容器, 而Map则是其他语言的字典。
LinkedList or ArrayList ?
List 分为 LinkedList 和 ArrayList,这两个东西各有各的好处, LinkedList 动态插入速度快,而ArrayList随机访问速度快。
统一访问接口?
说到统一访问接口,就不得不提到迭代器(Iterator)
迭代器规范了泛型容器的访问方式,无论是Map 还是Collection 都实现了这个接口。
回到List
List 类定义了一些方法用于操作保存的对象,分别是:
boolean contains(object) // 判断一个对象是否存在于容器数组里面
List<type> subList(start, end) // 跟 substring方法类似,用于生成子容器
void retainAll(object) // 返回一个交集,保留两个容器中相同的对象。
void removeAll(object) // 移除所有在object容器中出现的元素
Array toArray() // 将对象返回成数组
迭代器
一般的迭代器只支持向下迭代,迭代器共有3个方法:
- next
- hasNext
- remove
调用remove之前,必须要先调用next
迭代器的使用
// new Iterator
Iterator<Object> it= Objects.iterator();
while(!it.hasNext()) {
it.next();
}