Java-内部类(三)成员内部类就应该访问外部类的成员!!
来源:互联网 发布:oracle数据迁移方式 编辑:程序博客网 时间:2024/05/01 03:48
1. 成员内部类就应该访问外部类的成员!
同样的,我们以LinkdeHashMap为例,解释内部类的定位和为什么成员内部类可以访问外部类的成员变量。
上JDK源码(部分细节删除)
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{
private abstract class LinkedHashIterator<T> implements Iterator<T> {
Entry<K,V> nextEntry = header.after;
Entry<K,V> lastReturned = null;
int expectedModCount = modCount;
public boolean hasNext() {
return nextEntry != header;
}
public void remove() {
}
Entry<K,V> nextEntry() {
}
}
private class KeyIterator extends LinkedHashIterator<K> {
public K next() { return nextEntry().getKey(); }
}
private class ValueIterator extends LinkedHashIterator<V> {
public V next() { return nextEntry().value; }
}
private class EntryIterator extends LinkedHashIterator<Map.Entry<K,V>> {
public Map.Entry<K,V> next() { return nextEntry(); }
}
}
上面的LinkdeHashMap定义了一个抽象内部类和几个抽象内部类的实现类作为成员内部类。这么做的好处是什么呢,很容易看到:这样做成员内部类可以以很爽的直接使用外部类的方法和成员变量(modCount / header...)。就像我们把心脏作为内部类作为内部类定义在人体类的内部,这样一方面保护了心脏的功能不被当做普通的抽水泵使用(可见性控制),同时我们可以直接使用人体中的血液、能量等,而不需要人体再传输给心脏了(减少沟通成本)。
以上,就是说成员内部类的定位之一就是要方便的同外部类沟通。
2. 实现原理
其实现方式是,在内部类中持有一个外部类类型的变量;下面是外部类和内部类的定义,下图是反编译内部类后的输出(没有截图常量池)
public class InnerClassFinalVar {
String ss ="g g s";
class InstanceInnerClass{
private int v = 0;
private void print(){
System.out.println("InstanceInnerClass : "+ss);
}
}
}
可以看到第一行,在内部类的内部维护了一个名称为this&0, 类型为我定义的外部类,的变量,同时这个变量被finnal修饰;同时,在下图黄字部分deputfield,是编译器将外部类的的变量赋值给this&0,这样就在内部类持有了一个外部类类型的变量,用来方位外部类的成员。
阅读全文
0 0
- Java-内部类(三)成员内部类就应该访问外部类的成员!!
- Java内部类为什么可以访问外部类的成员
- 内部类访问外部类成员
- JAVA中内部类访问外部类成员
- 外部类能访问内部类的成员
- 外部类可以访问内部类的私有成员
- 为什么内部类可以访问外部类的成员
- 内部类,外部类成员的相互访问 及内部类对象的创建
- 内部类之设计模式-内部类可以访问外部类的私有成员
- 内部类之设计模式-内部类可以访问外部类的私有成员
- java 内部类(成员内部类)
- java 内部类(成员内部类)
- java语言基础(47)——成员内部类访问外部类的成员(类名.this范围限定)
- Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)
- 深入理解Java中为什么内部类可以访问外部类的成员
- 深入理解Java中为什么内部类可以访问外部类的成员
- 深入理解Java中为什么内部类可以访问外部类的成员
- java 内部类和外部类互相访问各自的私有成员
- 通信录工具类
- JDK源码解析之ArrayList
- please remove installation media and close the tray (if any) then press ENTER
- 设计模式之合成复用原则
- RXD's date
- Java-内部类(三)成员内部类就应该访问外部类的成员!!
- 构造函数、析构函数 与抛出异常
- 线程的两种实现方式。
- js获取元素的偏移量offset
- (5) 什么是数据项--每天五分钟学习数据结构
- eclipse中tomcat能正常启动,可以访问页面,但是浏览器访问不了tomcat首页之tomcat配置问题
- Keras TFLearn TensorLayer实例【转】
- TensorFlow 实现Softmax Regression 识别数字
- java求解 集合的子集