1.内部类是指Java中可以将一个类定义在另一个类的内部;
2.内部类可以定义在类的内部,那也就是和类成员一个层次--->成员内部类;
3.内部类可以定义在方法和块的内部,那也就比类成员低一个层次--->和局部变量一个层次--->局部内部类;
3.匿名内部类:成员匿名内部类、局部匿名内部类;
4.静态(static修饰的)内部类:是静态成员内部类;
5.$通常用来命名内部类字节码文件--->外部类$内部类.class;
*1.成员内部类:
(1).成员内部类可以和正常类成员一样使用不同的修饰符(特征、权限修饰符都可以)来修饰;
(2).优点:省略了一个源文件(.java);在成员内部类中可以访问外部类的所有成员,包括私有元素;
(3).不可以直接创建内部类的对象,需要通过外部类的对象来创建内部类的对象--->外部类的对象.new 内部类;
(4).若想在内部类中通过对象.调用外部类的成员,需要写成:外部类.this.外部类成员(重名的时候这样,如果不重名可以直接用);
2.局部内部类:
(1).因为局部内部类的层次和变量一样,所以可以用的权限修饰符和变量一致,只有一个默认不写;特征修饰符中,由于是变量层次所以不可以用static来修饰,但是由于还是一个类,所以可以用abstract和final来修饰;
(2).局部内部类命名规则Demo$1InnerDemo--->表示第一次出现;
(3).局部类里面使用变量只能是final修饰的变量,可以直接用外部类的属性;
*3.匿名内部类
1.也分成员/局部;
2.通常是他们的具体子类为了实现接口/抽象类写的,为了省略这个子类的文件而使用的,一般用局部的;格式如下:
//这是一个接口;
public Interface Box{
}
Box box=new Box(){
//这就相当于是一个类,没有名字的;
//里面写用来多实现这个接口的内容;
}
3.只有类体,没有类的所有结构(修饰符、名字、继承、实现、构造方法);任何修饰符都不可以用,一般用作按钮;
4.可以把这个Box类型的返回值box定义在类的属性里,那么就可以通过这个类的属性来调用这个方法;
4.静态(static修饰的)内部类:
1.可以用正常new的方式创建它的对象,不需要通过外部类的对象;
2.不能访问非静态成员(自己类和外部类都一样);
3.权限修饰符都可以使用,特征修饰符也是;
主类可以用的修饰符 :public/默认不写;abstract/final;
成员内部类可以用的修饰符:public/protected/默认不写/private:abstract/static/final;
局部内部类可以用的修饰符:默认不写;final/abstract;
静态(成员)内部类可以用的修饰符:public/protected/默认不写/private:abstract/final;