内部类定义
一个类或者接口定义在另外一个类或者接口的内部。
public class A1{//外部类
class B1{}//内部类
interface C1{}//内部接口
}
将一个类定义置入另一个类定义中,称作“内部类”。
1.内部类之外的类称为外部类
2.内部类的名称必须区别于它所在的外部类,和其它类之间没有要求内部类的全名叫做【外部类名称$内部类名称】
3.内部类可以访问其外部类的所有变量和方法,外部类不能直接访问内部类的实现细节
4.内部类比外部类多了private/protected/static三个修饰符,这三个修饰符不能用在外部类上
内部类的作用
1.内部类提供更好的封装
2.内部类可以直接访问外部类的私有成员外部类
3.不能直接访问内部类的成员
4.匿名内部类适合用于创建仅仅使用一次使用的类
内部类分类
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。
内部类实际拥有外部类的一个引用,在构造函数中将外部类的引用传递进来。
非静态内部类
public class A1{
protected class B1{}
}
非静态内部类特点:
1.和其他类一样,它只是定义在外部类中的另一个完整的类结构
2.和外部类不同的是,它可以允许四种权限修饰符: public,protected,缺省,private
3.还可以在非静态内部类中使用外部类的所有成员,哪怕是私有的在外部类的静态成员中不可以使用非静态内部类哦
4.在外部类的外面必须通过外部类的对象才能创建非静态内部类的对象
静态内部类
public class A1{
protected static class B1{}//静态内部类
}
静态内部类特点:
1.和其他类一样,它只是定义在外部类中的另一个完整的类结构
2.和外部类不同的是,它可以允许四种权限修饰符: public,protected,缺省,private
3.只可以在静态内部类中使用外部类的静态成员
4.在外部类的外面不需要通过外部类的对象就可以创建静态内部类的对象
5.如果在内部类中有变量与外部类的静态成员变量同名,可以使用“外部类名."进行区别
局部内部类
可以将内部类定义在一个方法活着一个代码块内。
局部内部类特点:
1.和外部类一样,它只是定义在外部类的某个方法中的另一个完整的类结构
2.和成员内部类不同的是,它前面不能有权限修饰符等
3.局部内部类如同局部变量一样,有作用域
4.局部内部类中是否能访问外部类的静态还是非静态的成员,取决于所在的方法
5.局部内部类中还可使用所在方法的局部常量,即用final声明的局部变量
匿名内部类
匿名内部类就是内部类的简写格式,匿名内部类的前提是必须继承或者实现一个外部类或者接口
1.匿名内部类由于没有名字,所以它没有构造函数
2.如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数
3.不能定义静态成员
匿名内部类的使用场景
当方法参数是接口类型时,而且接口中的方法不超过三个,可以用匿名内部类作为实际参数进行传递
匿名内部类的使用限制
1.匿名内部类不能是抽象的
2.匿名内部类不能定义构造器,默认和父类相似的构造器
3.JDK1.8-要求给局部内部类、匿名内部类访问的局部变量必须使用final修饰,从JDK1.8开始这个现实被取消了,但是默认是final的(不能修改)