内部类
- Inner类定义在Outer类的内部,相当于Outer类的一个成员变量的位置,Inner类可以使用任意访问控制符(public、protected、private等)
- Inner类中定义的方法可以直接访问访问Outer类中的数据,而不受访问控制符的影响,即使是Outer类的私有属性
- 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去new一个内部类对象(即 Outer. Inner 对象=new Outer().new Inner() )
- 编译上面的程序后,会产生两个.class文件:Outer. class、Outer$Inner.class
- 成员内部类中不能存在任何static的变量和方法,但可以定义常量:
1、非静态内部类是要依赖于外部类的实例,而静态变量和方法是不依赖对象的,仅与类有关
2、常量是在编译器就确定的,放到所谓的常量池了
tip:
- 外部类不能直接使用内部类的成员和方法的,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法
- 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果访问外部类的成员变量可以使用this关键字,如:Outer.this.name
静态内部类
- 静态内部类不能直接访问外部类的非静态成员,但可以通过“new 外部类().成员”的方式访问
- 如果外部类的静态成员与内部类的成员,名称相同,可通过“类名.静态成员”方式访问外部类的静态成员。如果不相同,则可以通过“成员名”直接调用外部类的静态成员
- 创建静态内部类的对象时,不需要外部类对象,可以直接创建(外部类.内部类 对象=new 外部类.内部类())
方法内部类:
其作用域仅限于方法内,方法外无法访问该内部类
- 局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的
- 只能访问方法中定义的final类型的局部变量,但jdk1.8之后可以不用final修饰
匿名内部类
- 匿名内部类是直接使用new来生成一个对象的引用;
- 对于匿名内部类的使用,它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类是不能够被重复使用
- 使用匿名内部类时,必须是继承一个类或者实现一个接口,其实也是只能继承一个类或者实现一个接口
- 匿名内部类中是不能定义构造函数的,匿名内部类中不能存在任何的静态成员变量和静态方法
- 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法
- 匿名内部类初始化;使用构造代码块,利用构造代码块能够达到为匿名内部类创建一个构造器的效果
网友评论