Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)

时间:2022-09-25 15:14:21

Java基础_内部类:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。

内部类的主要作用:使用内部类可以减少命名冲突。

定义位置:一个内部类可以定义在一个类中,也可以在一个方法中,甚至在一个表达式中。

广义上讲,内部类分为四种:

静态内部类(static inner classes)

成员内部类(member inner classes)

局部内部类(local inner classes)

匿名内部类(anonymous inner classes)

1、静态内部类(static inner classes)

最简单的内部类。

只能访问外部类的静态成员变量与静态方法。

生成静态内部类对象的方法:

OuterClass.InnerClass inner = new OuterClass.InnerClass();

相关使用例子:静态内部类

 class StaticInner{

      private static int a = ;

      /**

 4    * 静态内部类

 5    * 生成的类名:StaticInner$InnerClass

 6    */

      public static class InnerClass{

 8         //静态内部类可以声明静态的成员变量,其他的内部类不可以

         private static int b = ;

         public void execute(){

             //静态内部类只能访问静态程序

             System.out.println(a + b);

         }

     }

 }

//main方法中使用:

 public static void main(String[] args) {

     //创建静态内部类

     StaticInner.InnerClass innerClass = new StaticInner.InnerClass();

     innerClass.execute();

 }

2、成员内部类(member inner classes):

成员内部类可以访问外部类的静态与非静态的方法和成员变量。

生成成员内部类对象的方法:

OuterClass.InnerClass inner = new OuterClass().new InnerClass();

在局部内部类中访问外部类的成员变量的方法:

OuterClass.this.a;

相关使用例子:成员内部类

 class MemberInner{

      private int a = ;

      public void execute(){

          //在外部类中创建成员内部类

          InnerClass innerClass = this.new InnerClass();

      }

      /**

10  * 成员内部类

11  */

     public class InnerClass{

         //内部类可以创建与外部类同名的成员变量

         private int a = ; 

         public void execute(){

             //this引用的是内部类

              System.out.println(this.a);

             //在内部了中使用外部类的成员变量的方法

             System.out.println(MemberInner.this.a);

         }

     }

 }

//在main方法中使用:

 public static void main(String[] args) {

     //创建成员内部类

     MemberInner.InnerClass innerClass = new MemberInner().new InnerClass();

     innerClass.execute();

 }

3、局部内部类(local inner classes):

类似于局部变量,不能定义为public,protected,private或者static类型。

定义方法中,只能方法中声明为final类型的变量。

相关使用例子:局部内部类

  class LocalInner{

      public void execute(){

          final int a = ;

       /**

 6      创建局部内部类

 7      */

          class InnerClass{

              public void execute(){

                 System.out.println("LocalInner Class”);

                 //局部内部类只能访问final类型的变量

                 System.out.println(a);

             }

         }

         //只能在所在方法区域创建

         new InnerClass().execute();

     }

 }

//在main方法中使用:

 public static void main(String[] args) {

     //外部不能直接创建局部内部类

     LocalInner localInner = new LocalInner();

     localInner.execute();

 }

4、匿名内部类(anonymous inner classes):

匿名内部类没有类名,没有class关键字也没有extends和implements等关键字修饰。

匿名内部类会隐式地继承一个父类或实现一个接口。

相关使用例子:匿名内部类

  public static void main(String[] args) {

      AnonymousInnerClassTest test = new AnonymousInnerClassTest();

      /**

 5  * 创建匿名内部类

 6  * 生成的类名:AnonymousInnerClassTest$1

 7  */

      test.print(new Date(){

          //重写toString()方法

         @Override

         public String toString() {

             return "Hello world.";

         }

     });

     JButton button = new JButton();

     /**

19  * 创建匿名内部类

20  * 该匿名内部类实现ActionListener接口

21  * 生成的类名:AnonymousInnerClassTest$1

22  */

     button.addActionListener(new ActionListener(){

         //实现接口中的方法

         @Override

         public void actionPerformed(ActionEvent e) {

             System.out.println("使用匿名内部类实现ActionListener接口");

         }

     });

 }

 public void print(Date date){

     System.out.println(date);

 }