zoukankan      html  css  js  c++  java
  • 内部类(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);

        }

    }

     

  • 相关阅读:
    【】130个好的资源网站
    c++输出控制字体颜色
    【】程序员经典面试题
    c语言链表——模拟链表
    c语言链表——链表
    一些Markdown编辑器
    【】如何评价Github发布的文本编辑器atom?
    遍历简单XML节点
    jQuery重要插件!
    nvarchar与varchar的区别
  • 原文地址:https://www.cnblogs.com/zfc2201/p/2143649.html
Copyright © 2011-2022 走看看