一般而言,内部类与包含它的外部类有比较密切的关系,而与其他类关系不大,定义在类的内部,可以实现对外部的完全隐藏,可以有更好的封装性,代码也表现的更为简洁。

  • 不过内部类只是java编译器的概念,对于java虚拟机而言,不知道内部类这么一回事,每个内部类最后都会被编译成一个独立的类,生成一个独立得字节码文件。
  • 内部类的分类:(1)静态内部类(2)成员内部类(3)方法内部类(4)匿名内部类
  1. 静态内部类:静态内部类的定义与静态方法的定义的位置一样,也带有static关键字。
public class Outer {
	
	@Test
	public void test() {
		StaticInner staticInner = new  StaticInner();
		staticInner.test();
		System.out.println("fangfa===========");
	}
	
	private static class StaticInner {
		public StaticInner() {
			// TODO Auto-generated constructor stub
		}
		public void test() {
			System.out.println("staticInner_method");
		}
	}
}

静态内部类为StaticInner,带有static修饰符,除了形式上的差别以外,别的与一个独立的类差别不大,可以包含静态变量、静态方法、构造函数、成员方法等等;但是只能访问外部类Outer的静态方法、静态变量(即静态资源)。在外部需要使用需要通过“外部类.静态内部类”的方式调用,如:

Outer.StaticInner si = new Outer.StaticInner();
si.test;
  1. 成员内部类:与静态内部类想比,成员内部类则是没有static关键字的修饰。
public class Outer {
	private String str = "nihao";
	@Test
	public void test() {
		Inner inner = new  Inner();
		staticInner.test();
		System.out.println("fangfa===========");
	}
	
	private class Inner {
		public Inner() {
			// TODO Auto-generated constructor stub
		}
		public void test() {
			System.out.println("Inner_method"+str);
		}
	}
}

与静态内部类不同的是成员内部类除了可以访问外部类Outer的静态方法和变量以外,还可以直接访问外部类的实例变量和方法,如Inner的方法test()直接访问外部类Outer的str变量。同时也可以使用

Outer.this.str

来调用。

  3.方法内部类:                                                                                                                                                                                              

public class Outer {
	private String str = "nihao";
	
	@Test
	public void method() {
		int a = 100;
		System.out.println("fangfa===========");
		class MethodInner {
			
			public void test() {
				System.out.println("staticInner_method"+Outer.this.str);
				System.out.println("staticInner_method"+ a);
			}
		}
		
		MethodInner inner = new MethodInner();
		inner.test();
	}
}

 

类MethodInner定义在外部类方法method中,方法内部类只能在定义的方法内使用。若方法是实例方法,则除了静态变量和方法,内部类还可以直接访问外部类的实例变量和方法,如直接访问外部私有实例变量str。但是如果方法是静态方法,则方法内部类只能访问外部类的静态变量及方法。

  4.匿名内部类:匿名内部类是与new关键字关联的,在创建对象的时候定义类,new后面是父类或者父接口。