内部类
- 静态内部类
- 成员内部类
- 局部内部类
- 匿名内部类(属于局部内部类的一种)
1. 静态内部类
-
静态内部类可以等同看作静态变量
-
内部类的重要作用:
- 可以访问外部类中的私有数据
-
静态内部类可以直接访问外部类的静态数据(静态变量,静态方法),无法直接访问成员(实例变量,实例方法)
class OuterClass { // 静态变量 private static String s1="A"; //实例变量 private String s2 = "B"; //静态方法 private static void m1() { System.out.println("static's m1() method executed"); } //实例方法 private void m2() { System.out.println("m2() method executed"); } // 定义静态内部类,可以使用 public, private, protected, default修饰 static class InnerClass{ // 静态方法 public static void m3() { System.out.println("static's m3() method executed"); System.out.println(s1); m1(); // System.out.println(s2); // m2(); } // 成员方法 public void m4() { System.out.println("m4() method executed"); System.out.println(s1); m1(); // System.out.println(s2); // m2(); } } public static void main(String[] args) { //执行m3 OuterClass.InnerClass.m3(); // 执行m4 OuterClass.InnerClass inner = new OuterClass.InnerClass(); inner.m4(); } }
2. 成员内部类
-
成员内部类可以等同看作成员方法
-
成员内部类中不能有静态声明
- 包括静态变量和静态方法
-
成员内部类可以访问外部类的所有数据
public class MemberInnerClass { // 静态变量 private static String s1="A"; //实例变量 private String s2 = "B"; //静态方法 private static void m1() { System.out.println("static's m1() method executed"); } //实例方法 private void m2() { System.out.println("m2() method executed"); } // 定义静态内部类,可以使用 public, private, protected, default修饰 class InnerClass{ // 静态方法// 成员内部类中不能有静态方法 // public static void m3() { // // System.out.println("static's m3() method executed"); // System.out.println(s1); // m1(); System.out.println(s2); m2(); // } // 成员方法// 成员内部类可以访问外部类的所有数据 public void m4() { System.out.println("m4() method executed"); System.out.println(s1); m1(); System.out.println(s2); m2(); } } public static void main(String[] args) { // 创建外部对象 MemberInnerClass mic = new MemberInnerClass(); InnerClass inner = mic.new InnerClass(); inner.m4(); } }
3. 局部内部类
-
局部内部类等同于局部变量
-
局部内部类不能用访问权限控制修饰符修饰
- 局部变量也没有见过用public等修饰符修饰的(=_=)
-
局部内部类中不能有静态声明(包括静态变量和静态方法)
-
局部内部类中访问内部类外的局部变量必须是
final
的-也可以不是
final
的,只要后续不在局部内部类外改变这个变量的值就可以啦 -
局部内部类相当于局部变量,出了大括号
{}
之后就没人认识了- 要使用局部内部类中的方法,必须在局部内部类外,创建局部对象
public class TempInnerClass { public void m1() { final int i = 10; // 声明局部内部类时候,class前面不能加访问控制修饰符 class InnerClass{ // public static void m1() {// 局部内部类中不能有静态声明 // }; public void m1() { //Local variable i defined in an enclosing scope must be final or effectively final System.out.println(i);// 局部内部类调用内部类外的变量时候,变量必须是final的或者是有效的final的 } } // i = 100; // 调用局部内部类中的方法 InnerClass inner = new InnerClass(); inner.m1(); } public static void main(String[] args) { new TempInnerClass().m1(); } }
4. 匿名内部类
指的是:类没有名字
一般用于接口的实现
-
优点:少定义一个类
-
缺点:无法重复使用
public class NamelessInnerClass { public static void t(CustomeService cs) { cs.logout(); } public static void main(String[] args) { //如何调用t方法?? // 1. 新建一个类,实现CustomeService接口 t(new CustomeServiceImp()); // 2. 使用匿名内部类 // new CustomeService() {} 这些全都属于匿名内部类 t(new CustomeService() { @Override public void logout() { System.out.println("匿名内部类:成功退出程序"); } }); } } interface CustomeService{ void logout(); } class CustomeServiceImp implements CustomeService{ @Override public void logout() { System.out.println("成功退出程序"); } }