黑马程序员_内部类

------- android培训java培训、期待与您交流! ----------

内部类

内部类技术主要用于设计具有相互协作关系的集合。

内部类种类:

<1>成员内部类

<2>局部内部类

<3>匿名内部类

<4>静态内部类


一.成员内部类(与实例变量类似)

    成员内部类,顾名思义,是一个可以看成是外部类的实例成员(非静态成员)的内部类。成员内部类与普通的成员没有什么区别,可以与普通成员一样进行修饰和限制。

① 成员内部类和外部类相比有以下特点:

<1>成员内部类可以访问外部类的私有成员或属性。即使将外部类声明为private,成员内部类对它仍然是可见的。

    这是为什么?因为内部类的对象中有一个隐式引用,它指向创建它的外部类对象。

先明确一点,要有了外部类对象,才会有内部类对象。这个引用在内部类的定义中是不可见的。

外部类的引用在构造器中设置。编译器修改了所有内部类的构造器,添加了一个外部类的引用参数。

如:

private Outer outer;
public Inner(Outer out)
{
    outer = out;
} 


把外部类对象的引用传进来,赋给内部类中的一个引用。所以,内部类就持有外部类对象的一个引用。

<2>成员内部类是一个编译时概念,一旦编译成功,就会成为与外部类完全不同的类。如一个名称为Outer的外部类和其内部定义的名称为Inner的内部类,在编译完成后会出现Outer.class和Outer$Inner.class两个独立的类文件,其中Outer$Inner.class就是内部类生成的类文件。

② 在外部类的外部和内部创建内部类对象的区别:

<1>在外部类的内部创建一个内部类的对象可以直接使用

Inner i = new Inner();

<2>在外部类的外部创建一个内部类的对象,需要先建立一个外部类对象,然后在生成一个内部类的对象。这是因为内部类相当于外部类的成员,而成员只有在所属对象存在的情况下才存在。内部类的类名是 外部类类名.内部类类名,创建内部类对象的语法:

Outer.Inner 引用变量 =

            new Outer().new Inner();

还是与对象调用成员是一致的,只是现在的成员换成了一个内部类。

③ 内部类与外部类可以相互访问。

<1>内部类中访问外部类的成员:在外部类中,内部类也是其中的一员,所以在内部类中使用外部类的成员时,就相当与普通成员之间的互相访问,内部类可以很方便地调用外部类的任何成员,包裹私有成员。在内部类中访问本类的实例变量时用“this.属性”,而在内部类内部访问外部类的实例变量是用“外部类名.this.属性”。

<2>外部类中访问内部类的成员:如果在外部类中访问内部类的成员,需要先创建内部类的对象,然后直接调用需要访问的成员,即使是内部类的私有成员也可以访问。

<3>外部类的外部可以这样引用内部类:Outer.Inner

注意:成员内部类中不能含有静态成员。(含有静态成员的内部类必须是静态内部类)

二.局部内部类(与局部变量类似)

在方法中定义的内部类成为局部内部类,他是一个只有在局部有效的内部类。局部内部类作用域与局部变量类似,只在其所在的语句块中有效,所以只能在其有效的位置访问或创建对象。

局部内部类的语法规则:

<1>局部内部类的语法规则和成员内部类的语法规则大多相同,只是局部内部类是被定义在了方法中。

<2>与局部变量类似,在局部内部类前不能加publicprivate访问修饰符,其范围为定义它的代码块。

<3>局部内部类可以访问外部类,还可以访问final修饰的局部变量。

<4>在外部类的外部不能直接访问局部内部类。这样就有效地保证了局部内部类对外是不可见的。

三.静态内部类(与静态变量类似)

静态内部类其实已经脱离了外部类。在创建静态内部类对象时也不需要外部类对象的存在。其实质是一个放置在别的类内部的普通类。而关键字static也只是说明其在创建对象时不依赖与外部类对象的存在,取消外部引用,并不是说这个类本身是静态的。

静态内部类的语法规则:

<1>静态内部类声明前要加static关键字,也不可以用访问修饰符修饰。

<2>静态内部类只能访问外部类的静态成员,不能访问外部类非静态成员。

<3>静态内部类的对象可以直接生成,而不需要外部类的对象生成,这样实际上是使静态内部类成为了一个顶级类。这主要是因为静态内部类是外部类的静态成员,并不依赖与外部类的对象存在。

<4>静态内部类与非静态内部类的区别是本质的。非静态内部类是外部类对象组成的一部分,主要是辅助外部类对象工作的,与外部类对象存在着对成员变量的共享关系。

<5>当内部类中定义了静态成员时,改内部类必须是static的。当外部类的静态方法访问内部类时,内部类也必须是静态的。

<6>在内部类不需要访问外部类对象的时候,应该使用静态内部类。

四.匿名内部类

匿名内部类是一种特殊的局部内部类,这种内部类没有类名。改类适用于只使用一次并且不需要多次创建对象的类。使用匿名内部类可以使类代码与创建对象同时完成,这样做不但方便还提高了代码的可维护性。

匿名内部类没有名称,所以在声明的同时创建对象。匿名内部类的声明要么是基于继承,要么是实现接口。

一个匿名内部类一定是在new后面,用其隐含实现一个接口或扩展一个类,没有类名,根据多态使用其父类名。因为它是局部内部类,所以局部内部类的所有限制都对其生效。注意最后的分号结尾。

由于构造器的名字必须与类名相同,而匿名类没有类名,所以匿名类没有构造器。

语法格式:

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




------- android培训java培训、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值