今天看Java中的linkedList的实现,发现有这么一段:
这个类是LinkedList类的一个inner class。让我不明白是的,为什么它要是static类型的?
上网查了一下,大多只是建议这么用,却没有明确的说明为什么这样用比较好。
我觉得这样用的好处有三点:
1. 只为该内部类型产生一份类型定义。
据我估计,如果你的代码中有一个非静态内部类, 当你每次实例化它的外部类时,这个内部类都会被重新定义一份,放在堆中。
而如果使用了static的话,这个内部类就只有一份定义包含在外部类的class中,而不会随着新的实例的产生而产生。
2. 无须实例化外部类,也可以使用内部类,比方说,如果这个内部类是public的,那么我们就可以在其他地方使用它,而无需初始化它的外部类型。
3. 内部类无法访问外部类的绝大多数实例变量。虽然说静态变量还是会被访问到,但是实例变量不再会被内部类访问到,保证了一定的数据封装。
第二条和第三条经测试确实是这样的,但是第一条,因为对JVM的实现机制不了解,所以暂存疑惑,有高人懂的,帮忙解释下。
private static class Entry<E> {
E element;
Entry<E> next;
Entry<E> previous;
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
这个类是LinkedList类的一个inner class。让我不明白是的,为什么它要是static类型的?
上网查了一下,大多只是建议这么用,却没有明确的说明为什么这样用比较好。
我觉得这样用的好处有三点:
1. 只为该内部类型产生一份类型定义。
据我估计,如果你的代码中有一个非静态内部类, 当你每次实例化它的外部类时,这个内部类都会被重新定义一份,放在堆中。
而如果使用了static的话,这个内部类就只有一份定义包含在外部类的class中,而不会随着新的实例的产生而产生。
2. 无须实例化外部类,也可以使用内部类,比方说,如果这个内部类是public的,那么我们就可以在其他地方使用它,而无需初始化它的外部类型。
3. 内部类无法访问外部类的绝大多数实例变量。虽然说静态变量还是会被访问到,但是实例变量不再会被内部类访问到,保证了一定的数据封装。
第二条和第三条经测试确实是这样的,但是第一条,因为对JVM的实现机制不了解,所以暂存疑惑,有高人懂的,帮忙解释下。