内部类:
内部类:定义在另一个类里面或一个方法里的类叫做内部类。
一般包含四种内部类:静态内部类、匿名内部类、成员内部类、局部内部类。
-
静态内部类
public class Test { static class B{ } }
和静态变量、静态方法类似,静态内部类也是和当前类(Test)绑定。使用时,也是通过Test类来调用。
public class Test { static class B{ } public static void main(String[] args) { B b1 = new Test.B(); //在当前类Test中使用时,和静态变量,静态方法类似, //也可以把Test.B()省略写为B() B b2 = new B(); } }
-
匿名内部类
在一个方法或是代码块中定义的类,并且没有显示申明类的名称。public class Test { public static void main(String[] args) { //定义了一个匿名内部类 A a = new A(){ }; } } class A{ }
匿名内部类是使用的非常多的一种内部类,和A a = new A(); 这样的实例操作不同,后边还有一个大括号,表示可以重写方法,其实是定义了另外一个类(没有显示的类名,所以叫匿名)。经常用在需要实例化某个对象,但需要重写方法时,比如new接口,抽象类就是使用匿名内部类较多的方式。
public class Test { public static void main(String[] args) { //定义了一个匿名内部类 X x = new X(){ @Override public void callback() { } }; } } interface X{ void callback(); }
-
成员内部类
作为对象的一个成员来定义的类。public class Test { class C{ } }
和成员变量、实例方法类似,成员内部类也是和当前类的实例对象绑定的,类似Test类对象的成员。需要通过对象来使用:
public class Test { public static void main(String[] args) { C c = new Test().new C(); } class C{ } }
-
局部内部类
类似局部变量,局部内部类的作用域也是和局部变量类似,是在方法或是代码块中定义。这点和匿名内部类的作用域一样。局部内部类和匿名内部类的写法非常类似,只是显示声明了类的名称。public class Test { public static void main(String[] args) { class D extends A{ } System.out.println(new D()); } } class A{ }