Java内部类

来源:互联网 发布:龙信数据北京有限公司 编辑:程序博客网 时间:2024/06/10 17:30

Java内部类

使用内部类的原因

1.内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据

2.内部类可以对同一个包中的其他类隐藏起来。

3.当想要定义一个回掉函数且不想编写大量代码时,使用匿名内部类比较便捷。

内部类对象有一个隐式引用,它引用了实例化该内部对象的外围类对象。通过这个指针,可以访问外围类对象的全部状态。通过这个指针,可以访问外围类对象的全部状态。在Java中,static内部类没有这种附加指针。

使用内部类访问对象状态

当访问对象状态时,依靠的是外围类对象的引用outer。外围类的的引用在构造器中设置。编译器修改了所有的内部类的构造器,添加一个外围类引用的参数。

当内部类声明为私有的,这样一来,只有外围类才能够创造内部类的对象。只有内部类可以是私有类,而常规类只可以具有包可见性或公有可见性。

内部类的特殊语法规则

OuterClass.this.表示外围类引用

内部类中声明的所有静态域都必须是final。因为,我们希望一个静态域只有一个实例,不过对于每个外部对象,会分别有一个单独的内部类实例。如果这个域不是final,他可能就不是唯一的。

局部内部类

局部内部类即定义在某个块(如函数)内的类,局部类不能使用private或public进行说明。局部类对外部世界可以完全地隐藏起来,只有块内才可以访问它。

局部类不仅可以访问包含他们的外部类,还可以访问局部变量,不过那些局部变量必须为final

如果在局部内部类需要更改局部变量的值。如:需要在局部内部类更改局部变量final int counter = 0;则有补救的方法:使用一个长度为1的数组:

int[] counter = new int[1];局部内部类{counter[0]++;}

匿名内部类

如果一个类只创建一个对象,就不必命名了,这种类被成为匿名内部类。

new SuperType(construction parameters){    inner class methods and data}

SuperType可以是ActionListener这样的接口,于是内部类就要实现这个接口,SuperType也可以是一个类,于是内部类就要扩展它。

由于构造器的名字必须与类名相同,而匿名内部类没有类名,所以匿名内部类不能有构造器。取而代之的是,将构造器参数传递给超类构造器。尤其是在内部类实现接口的时候,不能有任何构造参数。

getClass对于静态方法不奏效。毕竟,调用getClass时调用的是this.getClass(),而静态方法没有this。所以应该使用以下表达式:

new Object().{}.getClass().getEnclosingClass()

在这里,new Object()}{}会建立Object的一个匿名子类的一个匿名对象,getEnclosingClass则得到其他外围类,也就是包含这个静态方法的类。

静态内部类

有时候,使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类对象。为此,可以将内部类声明为static,以便取消产生的引用。

静态内部类的对象没有对生成它的外围类有引用特权。

与常规内部类不同的是,静态内部类可以有静态域和方法。其实普通内部类也可以有静态域和方法,但是是特殊的(静态域必须被final修饰,静态方法只能访问外围类的静态域和方法)。

声明在接口中的内部类自动成为static和public类。

阅读全文
0 0
原创粉丝点击