很悲伤,在ITEye发表的一篇文章被喷的狗血淋头,也许出没于ITEye里的都是一些牛逼人物,在他们看来,也许我写的文章简直狗屁不如,但是有谁能保证刚开始踏入IT的自己马上能够写下出一些非常惊世骇俗的文章呢?没错,我的技术确实很烂,烂到家了。但是有一点我想要强调,那就是我喜欢Java,真的很喜欢。我不相信一夜之间就能称为Java高手,我只希望能够一步一个脚印,慢慢成长,我相信用不了多久,只要我能坚持写下去,终有一天,我能够写出令大家佩服的文章来。所以,今天我决定不再将文章发布到CSDN首页或者是ITEYE首页。直到有一天,我发现我的文章不再是一些讲解技术的话题,而是从更高的角度看待并分析问题。那么,我才有底气发表到首页让大家阅览。加油!!!
Java内部类(inner class)起始于JDK 1.1,内部类,顾名思义,类定义于另一个类里。外部那个类称为外部类(Outer class)
Java内部类可以分为以下几类:
1.实名内部类
2.匿名内部类
3.静态内部类
1.实名内部类:
同类中的属性和方法一样,该内部类可以由public protected private (default)修饰符来修饰,其访问控制同属性和方法。这里讲的是非静态的类,因此不含static关键字
实名内部类中不能有静态属性和静态方法(静态属性如果加上final则可以)
实名内部类可以访问外部类的全部属性和方法(包括私有)
创建实名内部类的一个实例,必须先创建外部实例,然后利用外部实例再创建实名内部类。
2.匿名内部类:
匿名内部类可定义在方法中,也可定义在属性定义中。匿名内部类负责定义一个子类,并创建一个实例,但是没有名字,因此叫匿名内部类,所以在定义匿名内部类的类体中不含有构造方法(因为不知道子类类名)。所以在创建实例时调用的构造方法其实是JVM自动添加进去的。匿名内部类除了可以继承类,还能实现接口。实现接口调用的构造方法只能是无参的构造方法,因为接口不含有构造方法。在类体中,同实名内部类相似,不能定义静态属性和静态方法(静态属性如果加上final则可以)。使用匿名内部类的一个优势是可以访问方法的局部变量(因为它定义在该方法中,自然在其有效范围中)。
3.静态内部类:
静态内部类,就是在类中增加static修饰符。
静态内部类中可以定义静态属性和非静态属性,静态内部类中所有的方法全部为静态方法。
和实名内部类不同的是,创建静态内部类不需要事先创建外部实例。可以直接通过类名.内部类名来创建。
下面是来自Oracle文档的一个经典例子。该例子中的内部类是一个帮助类,辅助经行遍历偶数。
package test; public class DataStructure { // create an array private final static int SIZE = 15; private int[] arrayOfInts = new int[SIZE]; public DataStructure() { // fill the array with ascending integer values for(int i=0; i< SIZE; i++) { arrayOfInts[i] = i; } } public void printEven() { // print out values of even indicies of the array InnerEvenIterator iterator = this.new InnerEvenIterator(); while(iterator.hasNext()) { System.out.println(iterator.getNext() + " "); } } // inner class implements the Iterator pattern private class InnerEvenIterator { // start stepping through the array from the beginning private int next = 0; public boolean hasNext() { // check if a current element is the last in the array return (next < SIZE ); } public int getNext() { // record a value of an even index of the array int retValue = arrayOfInts[next]; /* use outer class instance */ // get the next even element next += 2; return retValue; } } public static void main(String args[]) { // fill the array with integer values and print out only // values of even indices DataStructure ds = new DataStructure(); ds.printEven(); } }
内部类除了可以在类中作为一个帮助类以外,
另外开发过GUI程序的人都知道,在事件处理机制中大量使用了内部类。另外在Hibernate的源代码中也出现了许多内部类。