java内部类之见解


很悲伤,在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的源代码中也出现了许多内部类。

你可能感兴趣的:(java,匿名内部类,Class,静态内部类,inner,java内部类,实名内部类)