把一个类放到另一个类的内部定义,这个定义在其他类内部的类就被成为内部类。
内部类的作用如下:
1、内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同意个包内的其他类访问该类。
2、内部类成员可以直接访问外部类的私有数据,因为内部类被当成其他外部类成员,同一个类的成员间
可以相互访问,但外部类不能访问内部类的实现细节。
3、匿名内部类适合创建那些仅需要一次使用的类。
成员内部类:静态内部类和非静态内部类
非静态内部类:
1、内部类访问外部类Feild 外部类.this.feildName 访问自身feild this,feildName
2、非静态内部类可以访问外部类的private成员,反过来不成立,外部类必须显示非静态内部类对象来
访问其实例成员(非静态内部类对象必须寄存在外部类对象里)
3、不允许在非静态内部类中定义静态成员
静态内部类:使用static修饰的内部类
1、静态内部类可以包含静态成员也可以包含非静态成员
2、静态内部类只能访问外部类的静态成员不能访问外部类的实例成员
3、静态内部类是外部类的静态成员,因此外部类的静态方法、静态初始化块可以使用
静态内部类来定义变量、创建对象等
4、外部类不能直接访问静态内部类的成员,可以使用静态内部类的类名访问静态内部类的类成员
也可以使用静态内部类的的对象作为调用者访问静态内部类的实例成员
5、接口里可以定义内部类,只能是public访问控制符
使用内部类:
1、在外部类以外使用非静态内部类 OuterClass.InstanceClass varName
在外部类以外的地方创建非静态内部类实例 OuterInstance.new InnerConstructor()
2、如果需要在外部类以外的地方创建非静态内部类的子类时注意,非静态内部类的构造器必须通过
其外部类对象来调用。
3、在外部类以外的地方创建静态内部类的实例 new OuterClass.InnerConstructor()
4、创建静态内部类的子类 public class StaticSubclass extends StaticOuter.StaticIn {}
局部内部类:
1、内部类放在方法里定义,由于局部内部类不能在外部类的方法之外使用,因此局部内部类不能用访问控制符
static修饰
2、如果需要在局部内部类定义变量、创建实例或派生子类,只能在局部内部类所在的方法内进行
匿名内部类:
1、适合创建只需要一次使用的类,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失
匿名内部类不能重复使用。
4、匿名内部类不能是抽象类,不能定义构造器
5、当创建匿名内部类时,必须实现接口或抽象父类的所有抽象方法,也可以重写父类中的普通方法
6、如果匿名内部类需要访问外部类的局部变量,则必须使用final修饰外部类的局部变量
内部类的作用如下:
1、内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同意个包内的其他类访问该类。
2、内部类成员可以直接访问外部类的私有数据,因为内部类被当成其他外部类成员,同一个类的成员间
可以相互访问,但外部类不能访问内部类的实现细节。
3、匿名内部类适合创建那些仅需要一次使用的类。
成员内部类:静态内部类和非静态内部类
非静态内部类:
1、内部类访问外部类Feild 外部类.this.feildName 访问自身feild this,feildName
2、非静态内部类可以访问外部类的private成员,反过来不成立,外部类必须显示非静态内部类对象来
访问其实例成员(非静态内部类对象必须寄存在外部类对象里)
3、不允许在非静态内部类中定义静态成员
静态内部类:使用static修饰的内部类
1、静态内部类可以包含静态成员也可以包含非静态成员
2、静态内部类只能访问外部类的静态成员不能访问外部类的实例成员
3、静态内部类是外部类的静态成员,因此外部类的静态方法、静态初始化块可以使用
静态内部类来定义变量、创建对象等
4、外部类不能直接访问静态内部类的成员,可以使用静态内部类的类名访问静态内部类的类成员
也可以使用静态内部类的的对象作为调用者访问静态内部类的实例成员
5、接口里可以定义内部类,只能是public访问控制符
使用内部类:
1、在外部类以外使用非静态内部类 OuterClass.InstanceClass varName
在外部类以外的地方创建非静态内部类实例 OuterInstance.new InnerConstructor()
2、如果需要在外部类以外的地方创建非静态内部类的子类时注意,非静态内部类的构造器必须通过
其外部类对象来调用。
3、在外部类以外的地方创建静态内部类的实例 new OuterClass.InnerConstructor()
4、创建静态内部类的子类 public class StaticSubclass extends StaticOuter.StaticIn {}
局部内部类:
1、内部类放在方法里定义,由于局部内部类不能在外部类的方法之外使用,因此局部内部类不能用访问控制符
static修饰
2、如果需要在局部内部类定义变量、创建实例或派生子类,只能在局部内部类所在的方法内进行
匿名内部类:
1、适合创建只需要一次使用的类,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失
匿名内部类不能重复使用。
2、定义匿名内部类的格式,new 父类构造器(实参列表)|实现接口(){}
父类可以是抽象类,看起来像是抽象类可以实例化,其实Java内部会命名一个类名继承抽象类然后 实例化
3、匿名内部类必须继承一个父类或者实现一个接口,最多继承一个父类或实现一个接口4、匿名内部类不能是抽象类,不能定义构造器
5、当创建匿名内部类时,必须实现接口或抽象父类的所有抽象方法,也可以重写父类中的普通方法
6、如果匿名内部类需要访问外部类的局部变量,则必须使用final修饰外部类的局部变量