静态内部类

非静态内部类:

    非静态内部类中不能有静态方法、静态成员变量、静态初始化块。

静态内部类:

    如果使用static修饰一个内部类,则这个内部类就属于外部类本身,而不属性外部类的某个对象。

    静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。即使是静态内部类的事例方法也不能访问外部类的实例成员,只能访问外部类的静态成员。

    静态内部类是外部类的一个静态成员,因此外部类大的所有方法、所有初始化块中可以使用静态内部类来定义变量、创建对象等。

    外部类依然不能直接访问静态内部类的成员,但可以使用静态内部类的类名祖宗伟调用者来访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。

    接口里定义的内部类默认使用public static修饰,也就是说,接口内部类只能是静态内部类。

    如果为接口内部类指定访问控制符,则只能指定Public访问控制符;如果定义接口内部类时省略访问控制符,则该内部类默认是public访问控制符。

一、使用内部类

     1、在外部类内使用内部类

            不要在外部类的静态成员(包括静态方法和静态初始化块)中使用非静态内部类,因为静态成员不能访问非静态成员。

    2、在外部类以外使用费静态内部类

        如果希望在外部类以外的地方访问内部类(包括静态和非静态两种),则内部类不能使用private访问控制权限,private修饰的内部类智能在外部类内部使用。

        省略访问控制符的内部类,智能呗与外部类处于同一个包中的其他类所访问。

        使用proteced修饰的内部类,可被与外部类处于同一个包中的其他类和外部类的子类访问。

        class Out

{

//定义一个非静态内部类,不使用访问控制符,即同一个包中其他类可访问该内部类

class In

{

public In(String msg)

{

System.out.println(msg);

}

}

}

public class CreateInnerInstance

{

public static void main(String[] args)

{

    Out.In in = new Out().new In("测试信息");

    /*

    上面代码可改为如下三行代码:

    使用OutterClass.InnerClass的形式定义内部类变量

    Out.In in;

    创建外部类实例,非静态内部类实例将寄存在该实例中

    Out out = new Out();

    通过外部类实例和new来调用内部类构造器创建非静态内部类实例

    in = out.new In("测试信息");

    */

    }

}

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