内部类分类:
成员内部类
在类的成员位置,和成员变量以及成员方法所在的位置一样的
在内部类当中,可以直接访问外部类的成员,包括私有成员
Outer.Inner i = new Outer().new Inner();
成员内部类的修饰符:可以使用权限修饰符修饰修饰内部类,但是如果用私有来修饰,则无法在其他类中访问
可以使用static修饰成员内部类,不用再创建外部类的对象,
还可以使用abstract,final修饰,但无多大意义
局部内部类
在方法中,只能在方法中新建对象,方法被到用了,内部就会被执行
匿名内部类
可以把匿名内部类堪称是一个没有名字的局部内部类
定义在方法当中
必须在定义匿名内部类的时候创建他的对象
格式:
new 类/接口(){
如果是创建了继承这个类的子类对象,我们可以重写父类的方法
如果是创建了实现这个接口的子类对象,我们必须要实现该接口的所有方法
};
原理:创建了继承这个类的子类对象或者是创建了实现这个接口的子类对象
1 interface inner{ 2 public void function(); 3 } 4 class Outer{ 5 public void method(){ 6 new Inner(){ 7 @Override 8 pubilc void function(){ 9 sysout("function"); 10 } 11 }.function(); 12 13 //可以使用向上转型赋值给父类 14 Inner i = new Inner(){ 15 @Override 16 pubilc void function(){ 17 sysout("function"); 18 } 19 } 20 i.function(); 21 } 22 } 23 匿名内部类的应用场景: 24 作为参数进行传递,只用一次。 25 method( 26 new Animal(){ 27 @Override 28 public void eat(){ 29 sysout("aesdfghbjn"); 30 } 31 } 32 );
共性:
内部类仍然是一个独立的类,在编译之后,内部类会被编译成独立的.class文件,
但是前面冠以外部类的类名和$符号
内部类不能用普通的方法访问。内部类是外部类的一个成员,
此内部类可以自由地访问外部类的成员变量,无论是否是private的