Java里面有种类叫做内部类。在Java里面有四种内部类分别是匿名内部类,静态内部类,成员内部类,局部内部类。今天就来说说这几个内部类。

(1)匿名内部类:说白了就是把接口的实现写在方法的调用里面,而这个匿名的类就是接口的实现,而不是单独写出来。

这段代码,是把接口的实现单独写出来,没有用到匿名内部类:

public class Test {
	//静态方法
	public static void test(CustomerServcie cs){
		cs.logout();
	}
	
	//入口
	public static void main(String[] args) {
		test(new CustomerServiceImpl());
	}
}

//接口
interface CustomerServcie{
	void logout();
}

//编写一个类去继承去实现这个接口
class CustomerServiceImpl implements CustomerServcie{
	public void logout(){
		System.out.println("系统已经安全退出了!!!");
	}
}

这段代码是使用了匿名内部类的:

public class Test02 {
	//静态方法
		public static void test(CustomerServcies cs){
			cs.logout();
		}
		
		//入口
		public static void main(String[] args) {
//			test(new CustomerServicesImpl());
			//使用匿名内部类的方式执行test方法
			//整个这个”new CustomerServcies(){}“就是一匿名个内部类
			test(new CustomerServcies() {
				public void logout() {
					System.out.println("系统已经安全退出了!!!");
				}
			});
			
		}
}

//接口
interface CustomerServcies{
	void logout();
}

匿名内部类的优缺点:

优点:少定义一个类

缺点:缺点:不能重复使用

(2)成员内部类:成员内部类可以等同的看作成员变量

代码如下:

public class OutClass {
	//静态变量
	private static String s1 = "A";
	
	//成员变量
	private String s2 = "B";
	
	//静态方法
	private static void m1(){
		System.out.println("static'm1 method execute");
	}
	
	//成员方法
	private void m2(){
		System.out.println("m2 method execute");
	}
	
	//静态内部类
	//可以用访问权限的修饰符来修饰
	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) {
		OutClass.InnerClass.m3();
		
		//想让m4执行
		InnerClass inner = new OutClass.InnerClass();
		inner.m4();
	}
}

成员内部类的作用:可以访问外部类中私有的数据。

(3)静态内部类:<1>.成员内部类可以等同的看做成员变量。<2>.成员内部类中不能有静态方法。<3>成员可以访问外部类中所有的数据

代码如下:

public class OuterClass {
	//静态变量
	private static String s1 = "A";
	
	//成员变量
	private String s2 = "B";
	
	//静态方法
	private static void m1(){
		System.out.println("static'm1 method execute");
	}
	
	//成员方法
	private void m2(){
		System.out.println("m2 method execute");
	}
	
	//成员内部类
	//可以用访问权限的修饰符来修饰
	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) {
		//创建外部类的对象
		OuterClass out = new OuterClass();
		InnerClass inner = out.new InnerClass();
		inner.m4();//可以跑
	}
}

静态内部类可以直接访问外部类的静态数据,无法直接访问成员。

局部内部类:<1>局部内部类等同于局部变量。<2>局部内部类在访问局部变量的时候,局部变量必须使用final修饰

public class OuterClass {
	public void m1(){
		//局部变量
		final int i = 10;
		 
		//局部内部类
		//局部内部类不能用访问控制权限修饰符修饰
		//该类只在m1()方法里面有效	
		class InnerClass{
			//内部类中不能有静态声明
//			public static void m(){
//				
//			}
			
			//成员方法
			public void m2(){
				System.out.println(i);
			}
		}
		
		//调用m2()方法
		InnerClass inner = new InnerClass();
		inner.m2();
	}
	
	//入口
	public static void main(String[] args) {
		OuterClass out = new OuterClass();
		out.m1();
	}
}