内部类(Inner Class)

共有四种:

1.       静态内部类

编译生成StaticInnerClass$InnerClass.class文件

 

示例1

public class StaticInnerClassTest

{

    public static void main(String[] args)

    {

       //声明静态内部类的方式。

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

 

       inner.output();

    }

}

 

class StaticInnerClass

{

    private static int a = 4;

 

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

    public static class InnerClass

    {

       public void output()

       {

           System.out.println(a);

       }

    }

}

 

示例2

public class StaticInnerClassTest2

{

    public static void main(String[] args)

    {

       //静态内部类的静态方法,可以不用实例化静态类而直接调用。

       Animal.Cat.run();

       Animal.Dog.run();

    }

}

 

class Animal

{

    static class Cat

    {

       public static void run()

       {

           System.out.println("Cat is running");

       }

    }

   

    static class Dog

    {

       public static void run()

       {

           System.out.println("Dod is running");

       }

    }

}

 

 

2.       成员内部类

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

public class MemberInnerClassTest

{

    public static void main(String[] args)

    {

       //成员内部类的定义方式

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

      

       inner.output();

    }

}

 

class MemberInnerClass

{

    private int a = 4;

   

    public class InnerClass

    {

       private int a = 5;

      

       public void output()

       {

           //在成员内部类调用外部类的成员,必须使用下面的方式

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

       }

    }

}

 

 

 

3.局部内部类

定义在外部类的方法里面

public class LocalInnerClassTest

{

    public static void main(String[] args)

    {

       LocalInnerClass local = new LocalInnerClass();

       local.doSomething();

    }

}

 

class LocalInnerClass

{

    public void doSomething()

    {

       // 如果在外部类的方法里面定义一个变量,必须用fianl修饰,否则不能被局部内部类访问。

       final int a = 8;

 

       //在方法里声明的类就是局部内部类

       class InnerClass

       {

           public void test()

           {

              System.out.println(a);

           }

       }

 

       //只能在方法里实例化,并调用局部内部类的方法

       new InnerClass().test();

    }

}

 

 

4.匿名内部类

它会隐式地继承一个类或接口

public class AnonymousInnerClassTest

{

    @SuppressWarnings("deprecation")

    public String getDate(Date date)

    {

       return date.toLocaleString();

    }

 

    public static void main(String[] args)

    {

       AnonymousInnerClassTest test = new AnonymousInnerClassTest();

          

       //在这里匿名内部类会隐式地继承Date类,然后就可以重写toLocaleString方法,从面改变它的行为。

       String str = test.getDate(new Date()

       {

           @Override

           @SuppressWarnings("deprecation")

           public String toLocaleString()

           {

              return this.toGMTString();

           }

       });

      

       System.out.println(str);

    }

}

 

 

有了匿名内部类,我们在给组件注册事件时就可以用更为简单的方式 

public class SwingTest

{

    public static void main(String[] args)

    {

       JFrame frame = new JFrame("Anonymous InnerClass EventListener");

      

       JButton button = new JButton("Click me");

      

       button.addActionListener(new ActionListener()

        {

           @Override

           public void actionPerformed(ActionEvent e)

           {

              System.out.println("Welcome");

           }

       });

      

       frame.getContentPane().add(button);

      

       frame.addWindowListener(new WindowAdapter()

       {

           @Override

           public void windowClosing(WindowEvent e)

           {

              System.exit(0);

           }

       });

      

       frame.setSize(200,200);

      

       frame.setVisible(true);

    }

}

 

原文地址:https://www.cnblogs.com/zfc2201/p/2143649.html