序扯
很多书籍都在讲内部类的功能,比如说内部类可以直接访问外部类的属性和方法等,但是在java中是如何使用的呢,如果不是有相应的需求,相信大家平时也是使用的很少的,但是我们有经常被告知内部类的重要性,而且在很多面试中也会问道内部类的相关问题,在这种情况我们如何更好的去了解内部类呢?
从我个人看Java的源码的经验来说,如果你很想搞清楚Java中的一个概念呢,首先可以编写小例子然后查看运行效果,可以适用于大部分的基本的概念,但是又有很多的概念是在有相应需求的基础上产生的,如果我们没有亲身经历过这样的需求是很难理解的,最多的也只是从表面来理解,知道这个概念所描述的情景,但是却很难真实的体验到此概念起到的至关重要的作用。如果你也遇到了这种情况,也许你可以参考我的做法。
我个人的做法是,当遇到一些是在情景需求上面产生的概念的时候,如果不能通过编写一些小的应用的例子来理解,在这种情况下我会选择查看JDK中的源代码,找到相应概念实现的代码,通过分析其中的源码就能很好的帮助你理解一些带有情景需求的概念。通过这种方式的理解,能使得你对该概念使用的情景有了一定的了解,在以后编程的时候如果遇到类似的情况的时候,你就能将该概念应用到真实的情景中来解决真实的问题,达到活学活用以及举一反三的效果。
ArrayList中内部类的使用
今天通过分析JDK中ArrayList的源代码我们来讲解一下内部类真实的应用场景。
内部类具体的概念和具体具有什么样的功能我就不在这里啰嗦了,自己去百度一下或者google一下就可以知道了,今天在这里主要讲解内部类应用的场景,以及在JDK中的使用。
相信大家都是使用过ArrayList的吧,大家在遍历ArrayList的可能大部分都是使用的下面的方式来遍历的把
for (int i = 0; i < myList.size(); i++) {
int temp = (int)myList.get(i);
System.out.println(temp);
}
但是ArrayList还有一种遍历方式,那就是通过Iterator方式来遍历,代码如下
// iterator的遍历方式
Iterator<Integer> eiter = myList.iterator();
while(eiter.hasNext()){
// 自动拆箱
int temp = eiter.next();
System.out.println(temp);
}
在这种使用的情况下就使用了内部类,我们看一下myList.iterator()的源码,new了一个Itr的类,其实这个类就是ArrayList的内部类
/**
* Returns an iterator over the elements in this list in proper sequence.
*
* <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
*
* @return an iterator over the elements in this list in proper sequence
*/
public Iterator<E> iterator() {
return new Itr();
}
Itr内部类
/**
* An optimized version of AbstractList.Itr
*/
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
从上面Iterator的List遍历方式来看,myList.iterator()方法返回了定义在ArrayList中的一个内部类Itr的对象实例,根据内部类的概念以及功能来说,通过myList.iterator()方法返回的Itr的内部类的实例可以访问外部类的属性和变量的,所有myList.iterator()返回的Itr对象就是可以访问myList的属性和对象,就可以对myList中的属性和对象进行操作,就可以通过一定的方式遍历myList中的所有的元素,至于如何实现的大家自己去看源码。
总结
最近由于要找工作的原因,一直在看一些比较经典的关于Java和分布式的相关的书籍,虽然天气炎热,但是内心还是很平静,所有才能静下心来看书,可能是慢慢长大变得更加的成熟了,少了一下浮躁,多了一些淡定,所有也能更加的静下心来好好的阅读一下经典的书籍,在阅读的过程的同时自己也会合理的安排实践的时间,感觉自己也成长的比较快,虽然在代码编写的熟练程度上没有提升多少,但是通过对很多概念的重新理解、深入的理解,使得所编写的代码的可读性和健壮性增强了,而且由于理解的更加深入,对概念的内化有很大的帮助,最终形成自己的思想积淀。
既然内心淡定,而且能静下心来看更多经典的书籍,在阅读的同时也形成了许多自己的理解,在这个时候也是很希望能将自己的理解表达出来和大家一起分享、一起讨论、然后一起成长。
坚持阅读、思考、写作!