3.6 类的成员之五:内部类
3.6.1 静态内部类
①静态内部类可以等同看做静态变量。
②内部类重要的作用:可以访问外部类中私有的数据。
③静态内部类可以直接访问外部类的静态数据,无法直接访问成员。
④静态内部类不会持有外部的类的引用,创建时可以不用创建外部类,静态内部类可以直接访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问
public class OuterClass{
//静态变量 private static String s1 = "A";
//成员变量 private String s2 = "B";
//静态方法 private static void m1(){ System.out.println("static's m1 method execute!"); } //成员方法 private void m2(){ System.out.println("m2 method execute!"); } //静态内部类 //可以用访问控制权限的修饰符修饰。 //public,protected,private,缺省 static class InnerClass{ //静态方法 public static void m3(){ System.out.println(s1); m1();
//System.out.println(s2); //m2(); } //成员方法 public void m4(){ System.out.println(s1); m1();
//System.out.println(s2); //m2(); } } //入口 public static void main(String[] args){
//执行m3 OuterClass.InnerClass.m3();
//执行m4 InnerClass inner = new OuterClass.InnerClass(); inner.m4(); } } |
3.6.2 成员内部类
①成员内部类可以等同看做成员变量
②成员内部类中不能有静态声明
③成员内部类可以访问外部类所有的数据
public class OuterClass{ //静态变量 private static String s1 = "A"; //成员变量 private String s2 = "B"; //静态方法 private static void m1(){ System.out.println("static's m1 method execute!"); } //成员方法 private void m2(){ System.out.println("m2 method execute!"); } //成员内部类 //可以用访问控制权限的修饰符修饰。 //public,protected,private,缺省 class InnerClass{ //静态方法 //public static void m3(){} //成员方法 public void m4(){ System.out.println(s1); m1();
System.out.println(s2); m2(); } } //入口 public static void main(String[] args){ //创建外部类对象 OuterClass oc = new OuterClass(); InnerClass inner = oc.new InnerClass(); inner.m4(); } } |
3.6.3 局部内部类
①局部内部类等同于局部变量
②重点:局部内部类在访问局部变量的时候,局部变量必须使用final修饰
③局部内部类是在方法中定义的,它只能在当前方法中使用。和局部变量的作用一样
局部内部类和成员内部类一致,不能包含静态成员
public class OuterClass{ //方法 public void m1(){ //局部变量 final int i = 10;//
//局部内部类 //局部内部类不能用访问控制权限修饰符修饰。 class InnerClass{ //内部类不能有静态声明 //public static void m1(){} //成员方法 public void m2(){ System.out.println(i); // 10 } } //调用m2 InnerClass inner = new InnerClass(); inner.m2(); } //入口 public static void main(String[] args){ OuterClass oc = new OuterClass(); oc.m1(); } } |
3.6.4 匿名内部类
是一种特殊的内部类,该类没有名字
public class Test{ //静态方法 public static void t(CustomerService cs){ cs.logout(); } //入口 public static void main(String[] args){ //调用t方法 //t(new CustomerServiceImpl()); //使用匿名内部类的方式执行t方法 //整个这个"new CustomerService(){}"就是个匿名内部类 t(new CustomerService(){ public void logout(){ System.out.println("exit!"); } }); //匿名内部类的优点:少定义一个类. //缺点:无法重复使用! } } //接口 interface CustomerService{ //退出系统 void logout(); } //编写一个类实现CustomerService接口 /* class CustomerServiceImpl implements CustomerService{ public void logout(){ System.out.println("系统已经安全退出!"); } } */ |