Java内部类

内部类有静态内部类(嵌套内部类)、普通内部类、局部内部类、匿名内部类。

1嵌套内部类(静态内部类)

内部类是static时,称作是嵌套类。则1)创建嵌套类的对象时不再需要其外围类的对象;2)不能从嵌套类的对象中访问非静态的外围类对象。

静态内部类不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法。

2普通内部类(成员内部类)

内部类与普通类的区别:1)内部类的名字是嵌套在外部类中的;2)外部类将有一个方法,该方法返回一个内部类的引用。

       如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须以OuterClassName.InnerClassName的形式获取内部类对象的引用。构建内部类引用的时候需要一个指向其外围类对象的引用,如果编译器访问不到这个引用就会报错。普通内部类的字段和方法只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,有也不应该包含嵌套类(静态内部类)。

如下代码所示:

/**
 * 编写一个名为Outer的类,它包含一个名为Inner的类。在Outer类中添加一个方法,
 * 它返回一个Inner类型的对象,在main()中,创建并初始化一个指向某个Inner对象的
 * 引用。
 */
public class Excrise1 {
	/*定义一个内部类*/
	class Inner{
		Inner(){
			System.out.println("得到一个内部类的引用");
		}
	}
	/*外部类中定义一个返回Inner类型对象的方法*/
	public Inner getInner(){
		return new Inner();
	}
	public static void main(String[] args){
		Excrise1 e = new Excrise1();
		/*在main()中,创建并初始化一个指向某个Inner对象的引用*/
		Excrise1.Inner i = e.getInner();//方法一:通过调用外部类返回内部类引用的方法
Excrise1.Inner i2 = e.new Inner();//方法二:利用外部对象引用新建一个内部类对象引用
}
}

3 局部内部类

   在方法或者代码的作用域内创建一个完整的类,称作局部内部类,其作用范围为所在的代码块,是内部类中最少使用的一种类型。局部内部类和局部变量一样,不能被public、protected、private和static修饰,只能访问方法中定义为final类型的局部变量。分为静态局部内部类(位于静态方法内或者静态代码块内)和非静态局部内部类。

4 匿名内部类

       匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类,也可以实现接口,但是不能两者兼备。而且如果是实现接口,也只能实现一个接口。匿名内部类没有类名的内部类,不使用关键字class、extends、implements,没有构造函数,必须继承其他类或实现其他接口。匿名内部类的好处是代码更加简洁紧凑,但坏处是易读性下降。一般应用于GUI编程中实现事件处理等。

匿名内部类只能访问外部类的final类型的变量。

5. 使用内部类的好处

 ①   每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,

② 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

③ 方便编写事件驱动程序

④  方便编写线程代码


6.各个内部类可访问的变量类型总结

内部类的类型

可访问的外部变量

静态内部类

Static

普通内部类

Static、普通、final

局部内部类

Final

匿名内部类

Final



附上一个在网上看到的很好地一篇博客,http://www.cnblogs.com/dolphin0520/p/3811445.html


你可能感兴趣的:(Java内部类)