标签:
尽管内部类的使用违背了Java要比C++更加简单的设计理念,但是所谓存在即合理,内部类可以对同一个包中的其他类隐藏起来,内部类方法可以访问该类定义所在作用域中的数据,包括私有的数据,某些情况下使用匿名内部类的解决方案更简短易于理解。
内部类是定义在另一个类中的类。既可以定义在类中,也可以定义在类的方法中。
内部类的对象有一个隐式引用,它引用了实例化该内部对象的外部类对象,因此,通过这个指针,可以访问外部类的全部状态,内部类既能访问自身的数据域,又能访问创建它的外部类对象的数据域。注意:static内部类没有这种附加指针。
下面分别介绍局部内部类 静态内部类 和 匿名内部类。在介绍之前,简单说下Java中的static 和final 关键字作用。
final 关键字
修饰属性 表示属性值初始化后不可改变;
修饰方法,表示方法不可覆写,编译器遇到调用final方法时会转入内嵌机制,大大提高执行效率;
修饰类,表示类不可被继承,没有子类。
final关键字有无法被改变 终态的意思,可修饰局部变量,实例变量,静态变量,在创建之后,只能够赋值一次,但是定义时不必初始化。(接口中final属性必须初始化)还可修饰形参,表示读取参数,但无法改变参数的值。
static关键字
修饰属性,表示公共属性,所有实例对象共享,又叫类属性,静态属性;JVM只为静态变量分配一次内存,在内存中不管多少实例也只有一个拷贝。
修饰方法,表示类方法,和类属性一样,都可直接通过类名直接访问。
修饰内部类,不能修饰普通类。
static代码块,JVM加载类时会执行这些静态代码块,如果有多个,按出现顺序依次执行,每个代码块只会被执行一次。
局部内部类
在外部类的方法中实现的类,对外部世界完全隐藏,除了改方法,没有其他方法知道该类的存在。局部类不能用public和private访问说明符进行申明。它的作用域限定在这个局部类的块中。与其他内部类相比,局部内部类不仅能够访问其外部类的状态,还可以访问定义其的方法中的局部变量,但必须是final类型的局部变量。
匿名内部类
内部类也可以继承一个类或实现一个接口,假如只创建这个类的一个对象,就不必命名了。构造函数的名字与类名相同,匿名类没有类名,所以没有构造函数,取而代之的是,将构造器参数传递给父类构造函数;如果内部类实现接口,不能有任何构造函数。
静态内部类
有时候,使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外部类对象。为此,可以将内部类申明为static,以便取消产生的引用。这时,内部类就不能访问外部类的状态了。
标签:
原文地址:http://blog.csdn.net/u010498696/article/details/46287243