内部类

内部类:如果在类中在定义一个类,则将在类中再定义的那个类成为内部类。内部类可分为成员内部类、局部内部类和匿名内部类。
一、成员内部类
    当一个内部类定义在另一个类的成员位置上就称这个类为成员内部类。
内部类 可以直接访问外部类的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用:外部类名.this。而外部类要访问内部类就必须要建立内部类对象。
如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字进行操作。在内部类中使用this.x语句可以调用内部类的成员变量x,而使用“外部类名.this.x”语句可以调用外部类的成员变量x。
访问格式:

    1.当内部类定义在外部类的成员位置上,而且非私有,可以被外部其他类访问。

  格式:外部名.内部类名 变量名=外部类对象.内部类对象Outer.Inner inner=new Outer().new Inner();

  2.当内部类在成员位置上,就可以被成员修饰符所修饰。比如可以用private修饰会将内部类在外部类中进行封装,用static修饰后内部类就具有static的特性。当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。

   在外部其他类中,直接访问static内部类中的非静态成员可以用new outer.Inner().function()。

   在外部其他类中,直接访问static内部类中的静态成员可以用outer.Inner().function()。

    注意:当内部类中定义了静态成员,该内部类必须是static的。当外部类中的静态方法访问内部类时,内部类必须也是static的。

二、局部内部类
内部类不仅可以在类中进行定义,也可以在类的局部位置定义,如在类的方法或任意的作用域中,在局部位置定义的类被称为局部内部类。
当内部类被定义在局部时不可以再被成员修饰符修饰,仍然可以访问外部类中的成员,因为其还持有外部类的引用。但是不可以访问它所在局部中的变量,如果需要在局部内部类中使用局部变量,该局部变量需要被设置为final类型,即在方法中定义的局部内部类只能访问方法中final类型的局部变量。由于该局部变量内设置为final,所以不能在内部类中改变该局部变量的值。
三、匿名内部类

1.匿名内部类就是没有名字的内部类,其实就是内部类的简写格式匿名内部类就是一个匿名子类对象,可以理解为带内容的对象。

2.什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:

·只用到类的一个实例;

·类在定义后马上用到;

·类非常小(SUN推荐是在4行代码以下);

·给类命名并不会导致你的代码更容易被理解。

3.使用匿名内部类的原则:

a.匿名内部类不能有构造方法;

b.匿名内部类不能定义任何静态成员、方法和类;

c.匿名内部类不能是public,protected,private,static;

d.只能创建匿名内部类的一个实例;

e.一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类(内部类必须继承一个类或者实现接口);

4.匿名内部类的格式:new 父类或者接口(){定义子类的内容}

   注意:因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

你可能感兴趣的:(匿名内部类,成员内部类,局部内部类)