Java内部类,定义在内部的类称为内部类。
分为:静态内部类,成员内部类,局部内部类,匿名内部类
一、静态内部类
public class StaticInnerClassTest { public static void main(String[] args) { StaticInner.Inner inner = new StaticInner.Inner(); inner.test(); } } class StaticInner{ private static int a = 4; public static class Inner { public void test(){ System.out.println(a); } } }
只能访问外部类的静态成员变量与静态方法,生成静态内部类对象的方式为
OuterClass.Inner inner = new OuterClass.Inner()
二、成员内部类
class MemberInner{ private int a = 4; public class Inner2{ private int a = 5; public void doSomething(){ System.out.println("hello world"); } public void printA(){ //访问外部类 a = 4 System.out.println(MemberInner.this.a); } } } public class MemberInnerClassTest { public static void main(String[] args) { MemberInner.Inner2 inner2 = new MemberInner().new Inner2(); inner2.doSomething(); } }
三、局部内部类
定义在方法中,只能访问方法中声明的final类型变量
class LocalInner{ public void doSomeThing() { class Inner3{ public void test(){ System.out.println("hello world"); } } //方法中定义的类,在该方法中使用 new Inner3().test(); } } public class LocalInnerClassTest { public static void main(String[] args) { LocalInner inner = new LocalInner(); inner.doSomeThing(); } }
四、匿名内部类
匿名内部类会隐试的继承一个父类或者实现一个接口
1、匿名内部类重写toLocaleString方法
public class AnnoymousInnserClassTest { public String get(Date date){ return date.toLocaleString(); } public static void main(String[] args) { AnnoymousInnserClassTest test = new AnnoymousInnserClassTest(); //String str = test.get(new Date()); String str = test.get(new Date(){ public String toLocaleString() { return "Hello world"; } }); System.out.println(str); } }
打印结果:
2、使用Swing的匿名内部类
内部类Code
public class SwingTest { public static void main(String[] args) { JFrame frame = new JFrame("JFRame"); JButton button = new JButton("click"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("hello world"); } }); frame.setSize(200, 200); frame.getContentPane().add(button); frame.setVisible(true); } }