疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java内部类的使用


 

  一、在外部类里使用内部类

  非静态内部类

  对于初始化块:

  不允许在外部类的静态初始化块中创建非静态内部类的实例(可以声明变量,但不能创建实例)

  可以在外部类的普通初始化块中自由使用非静态内部类(既可以声明变量,又可以创建实例)

  对于成员方法:

  不允许在外部类的静态成员方法中创建非静态内部类的实例(可以声明形参、局部变量,但不能创建实例)

  可以在外部类的非静态成员方法中自由使用非静态内部类(既可以声明形参、局部变量,又可以创建实例)

  对于成员变量:

  可以定义 非静态内部类 类型的 静态成员变量,但是不能直接进行初始化,也不能在静态初始化块、静态成员方法中进行初始化;只能在构造方法、非静态成员方法、非静态初始化块中对其进行初始化。

  可以定义 非静态内部类 类型的 非静态成员变量,并能够直接初始化

  静态内部类

  可以在外部类的初始化块(静态、非静态)中自由使用静态内部类(既可以声明变量,又可以创建实例,也可以直接访问静态内部类的静态成员)

  可以在外部类的成员方法(静态、非静态)中自由使用静态内部类(既可以声明形参、局部变量,又可以创建实例,也可以直接访问静态内部类的静态成员)

  可以使用静态内部类来声明静态成员变量(静态、非静态)

  在外部类里可以自由使用静态内部类,就像使用非内部类一样。

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

  如果希望在外部类以外的地方访问内部类,则内部类不能使用private访问权限控制,private修饰的内部类只能在外部类内部使用。

  对于使用其他访问控制符修饰的内部类,则能在访问控制符对应的访问权限内使用。

  非静态内部类

  定义一个带有非静态内部类的类,代码如下:

  package org.lgy.study.innerclass;

  public class Out{

  public class In{

  public In(String msg){

  System.out.println(msg);

  }

  public void method1(){

  System.out.println("********");

  }

  }

  }

  下面演示如何在不同的包下使用上面定义的内部类,代码如下:

  package org.lgy.study.main;

  import org.lgy.study.innerclass.Out;

  public class InnerClassMain{

  public static void main(String[] args){

  //在外部类以外的地方定义内部类变量的语法格式为:OuterClass.InnerClass varName;

  Out.In in = null;

  //因为非静态内部类的对象必须寄存在外部类的对象里,因此创建非静态内部类对象之前,

  //必须先创建其外部类对象。并且必须使用外部类对象来调用内部类的构造器。

  //下面一行代码将创建一个外部类对象,之后创建的内部类对象将寄存在该外部类对象中

  Out out = new Out();

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

  in = out.new In("create inner class Out.In");

  in.method1();

  Out.In in1 = new Out().new In("create another inner class Out.In");

  in1.method1();

  }

  }

  静态内部类

  定义一个带有静态内部类的类,代码如下:

  package org.lgy.study.innerclass;

  public class StaticOut{

  public static class StaticIn{

  public StaticIn(String msg){

  System.out.println(msg);

  }

  public void method1(){

  System.out.println("*******");

  }

  }

  }

  下面演示如何使用上面定义的内部类,代码如下:

  package org.lgy.study.main;

  import org.lgy.study.innerclass.StaticOut;

  public class InnerClassMain{

  public static void main(String[] args){

  //在外部类以外的地方定义内部类变量的语法格式为:OuterClass.InnerClass varName;

  StaticOut.StaticIn in = null;

  //因为静态内部类属于外部类,所以创建内部类对象时必须使用外部类来调用构造器

  in = new StaticOut.StaticIn("create inner class StaticOut.StaticIn");

  in.method1();

  StaticOut.StaticIn in2 = new StaticOut.StaticIn("create another inner class StaticOut.StaticIn");

  in2.method1();

  }

  }