共有四种:
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. } 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. } }); 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); } } |