静态内部类、成员内部类、局部内部类、匿名内部类
一、静态内部类
/*
关于静态内部类:
1.静态内部类可以等同看做静态变量
2.内部类重要的作用:可以访问外部类中的私有数据
3.静态内部类可以直接访问外部类的静态数据,无法直接访问成员变量和成员方法
*/
public class Test01 { //静态变量 static String s1="A"; //成员变量 private String s2="B"; //静态方法 private static void m1(){ System.out.println("静态内部方法m1执行。。。。"); } //成员方法 private void m2(){ System.out.println("成员方法m2执行。。。。"); } //静态内部类 //可以用访问权限的修饰符修饰 //public protected private static class InnerClass{ //静态方法 public static void m3(){ System.out.println(s1); //System.out.println(s2); m1(); // m2(); } //成员方法 public void m4(){ System.out.println("m4...."); } } public static void main(String[] args){ //访问静态内部类的静态方法 Test01.InnerClass.m3();//A//静态内部方法m1执行。。。。 //访问静态内部类的成员方法,需要对象 InnerClass inner=new Test01.InnerClass(); inner.m4();//m4.... inner.m3();//A//静态内部方法m1执行。。。。 } }
二、成员内部类
/*
关于成员内部类:
1.成员内部类可以等同看做成员变量
2.成员内部类不能有静态声明(静态方法,静态变量)
3.成员内部类可以访问外部的所有方法,变量
*/
public class Test01 { //静态变量 static String s1="A"; //成员变量 private String s2="B"; //静态方法 private static void m1(){ System.out.println("成员内部方法m1执行。。。。"); } //成员方法 private void m2(){ System.out.println("成员方法m2执行。。。。"); } //成员内部类 //可以用访问权限的修饰符修饰 //public protected private class InnerClass{ //静态变量 //static int n=100; //静态方法 //内部类com.study.内部类.成员内部类.Test01.InnerClass中的静态声明非法修饰符 'static' 仅允许在常量变量声明中使用 // public static void m3(){ // System.out.println(s1); // //System.out.println(s2); // // m1(); // // m2(); // // } //成员方法 public void m4(){ System.out.println("m4...."); } } //入口 public static void main(String[] args){ //创建外部对象 Test01 t=new Test01(); InnerClass inner=t.new InnerClass(); inner.m4();//m4.... } }
三、局部内部类
/*
局部内部类:
局部内部类等同于局部变量
重点:局部内部类在访问局部变量的时候,局部变量必须使用final修饰
*/
public class Test01 { //方法 public void m1(){ //局部变量 final int i=10;// 从内部类引用的本地变量必须是最终变量或实际上的最终变量 //局部内部类 //局部内部类不能用访问控制权限修饰符修饰 class InnerClass{ //内部类不能有静态声明 // public static void m1(){} //成员方法 public void m2(){ System.out.println(i); } } // i=100;Error:(27, 36) java: 从内部类引用的本地变量必须是最终变量或实际上的最终变量 //调用m2 InnerClass inner =new InnerClass(); inner.m2(); } public static void main(String[] args){ Test01 t= new Test01(); t.m1();//10 } }
四、匿名内部类
/*
匿名内部类:指的是类没有名字
*/
原始实现方式
public class Test01 { //静态方法 public static void test(CustomerService cs){ cs.logout(); } //入口 public static void main(String[] args){ //调用test方法 test(new CustomerServiceImpl());//系统已退出! } } interface CustomerService{ //退出系统 void logout(); } //编写一个class实现CusromerService接口 class CustomerServiceImpl implements CustomerService{ public void logout(){ System.out.println("系统已经退出!"); } }
使用匿名内部类实现
public class Test01 { //静态方法 public static void test(CustomerService cs){ cs.logout(); } //入口 public static void main(String[] args){ //调用test方法 //test(new CustomerServiceImpl()); //使用匿名内部类的方式执行test方法 test(new CustomerService() { @Override public void logout() { System.out.println("系统退出!"); } }); //匿名内部类优点:少定义一个类 //缺点是:无法重复使用! } } interface CustomerService{ //退出系统 void logout(); } /* //编写一个class实现CusromerService接口 class CustomerServiceImpl implements CustomerService{ public void logout(){ System.out.println("系统已经退出!"); } } */