#1,成员内部类
public class TestInnerClass { private int id; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } /** * @param args * @author wangbiao * @Java内部类的使用 */ public static void main(String[] args) { //编译这个java文件,会产生两个class文件,TestInnerClass.class和TestInnerClass$Inner.class //能够访问成员内部类必须经过外部类对象 TestInnerClass outer = new TestInnerClass(); Inner inner = outer.new Inner(); inner.setName("inner"); outer.setName("outer"); outer.setId(1234567890); inner.work(); } void test(){//外部类非静态方法访问成员内部类 Inner inner = new Inner(); inner.work(); } class Inner{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //不可申明static类型的变量,else 编译报错 void work(){ System.out.println(id); System.out.println(name);//优先内部类属性 System.out.println(this.name);//内部类对象 System.out.println(TestInnerClass.this.name);//外部类对象 } } }
#2,方法内部类
//方法里面的内部类 void _test(String name){ //方法内部类,只能在定义改内部类的方法里面实例化该内部类 //方法内部类不能访问方法里面非final的变量,原因是存活期不同,方法里面的变量保存在栈中,而内部类对象是保存在堆中 //方法执行完后,保存在栈中的非final局部变量就会被删除,但是内部类对象可能仍然在堆中。 //方法里的内部类更像是局部变量,只能用final 和 abstact修饰 final int a = 10; class Inner_Second{ void test(){ System.out.println(a); } } } static void test_one(){ //只能访问外部类的静态变量 final int a = 10; class Inner_Second{ void test(){ System.out.println(VERSION+"-"+a); } } }
#3,静态内部类
//静态内部类相当于外部类之外的其他类,不能访问外部类的成员和方法。 TestInnerClass.Static_Inner static_Inner = new TestInnerClass.Static_Inner();
#4,匿名内部类
继承式+接口式+参数式