内部类
什么是内部类?
- 一个类中又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。
- 内部类的最大特点:可以直接访问私有属性,并且可以体现类与类之间的包含关系。
为什么使用内部类
- 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据
- 内部类可以对同一包中的其他类隐藏起来
- 当想要定义一个回调函数且不想编写大量代码是,使用匿名内部类比较便捷
基本语法:
class Outer { // 外部类
class Inner{ // 内部类
}
}
class Other { // 外部其他类
}
类的五大成员:
- 属性
- 方法
- 构造器
- 代码块
- 内部类
内部类的分类
定义在外部类的局部位置上(如方法内):
-
局部内部类
-
匿名内部类
定义在外部类的成员位置上:
-
成员内部类
-
静态内部类
局部内部类
说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名
基本语法:
class Outer {
public void m1() {
class Inner {
类体
}
}
}
细节
- 可以直接放问外部类的所有成员,包括私有的
- 不能添加访问修饰符,地位等同于局部变量,可以用 final 修饰
- 作用域:仅仅在定义它的方法或者代码块中
- 局部内部类---访问--->外部类的成员【访问方式:直接访问】
- 外部类访问---访问--->局部内部类的成员 【访问方式:创建对象,在访问(注意,必须在作用域内)】
- 外部其他类---不能访问--->局部内部类(地位等同于局部变量)
- 如果外部类和局部内部类的成员重名是,默认遵循就近原则,如果想访问外部类的成员,则可以使用【外部类名.this.成员】去访问。
匿名内部类
说明:匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名 (底层是有类名的,例如Outer$1,Outer$2 ……)
基本语法:
class Outer {
pubic void m1() {
new 类或接口(参数列表){
类体
};
}
}
细节
- 匿名内部类既是一个类的定义,同时本身也是一个对象。一次从语法上看,既有定义类的特征,创建对象的特征
- 可以直接访问外部类的所有成员,包括私有的
- 不能添加访问修饰符,因为地位等同局部变量
- 作用域:仅仅在定义它的方法或代码块中
- 匿名内部类--访问-->外部类成员 【访问方式:直接访问】
- 外部其他类--不能访问-->匿名内部类(因为匿名内部类地位等同于一个局部变量)
- 如果外部类和匿名内部类的成员重时,匿名内部类访问,默认遵循就近原则,如果想访问外部类的成员,则可以使用【外部类名.this.成员】去访问
- 可以当作实参直接传递,简洁高效
成员内部类
说明:成员内部类是定义在外部类的成员位置,并且没有 static 修饰
class Outer {
class Inner {
类体
}
}
细节:
-
可以直接访问外部类的所有成员,包含私有的
-
可以添加任意访问修饰符,应为它的地位就是一个成员
-
作用域和其他的外部类成员一样,为整个类体
-
成员内部类--访问-->外部类(比如属性),【访问方式:直接访问】
-
外部类--访问-->内部类,【访问方式:创建对象,再访问】
-
外部其他类--访问-->成员内部类
// 第一种方式 Outer.Inner outerInner = outer.new Inner(); // 第二种方法,在外部类中,编写一个方法,可以返回 这个内部类对象 getInnerInstance() Outer.Inner innerInstance = outer.getInnerInstance(); Class Inner { public Inner getInnerInstance() { return new Inner(); } } // 第三种方式(其实和第一种一样) new Outer().new Inner();
静态内部类
说明:静态内部类是定义在外部类的成员位置,并且有 static 修饰
class Outer { static class Inner { } }
-
可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
-
可以添加任意访问修饰符,应为它的地位就是一个成员
-
作用域和其他的外部类成员一样,为整个类体
-
静态内部类--访问-->外部类(比如属性),【访问方式:直接访问所有的静态成员】
-
外部类--访问-->静态内部类,【访问方式:创建对象,再访问】
-
外部其他类--访问-->静态内部类
// 方式一 Outer.Inner inner = new Outer.Inner(); // 方式二 // 编写一个方法, 可以返回静态内部类的实例对象 Outer.Inner inner1 = outer.getInner(); // 实例方法返回 Outer.Inner inner11 = Outer.getInner1(); // 静态方法返回 static class Inner { public Inner getInner() { // 可以是实例方法 return new Inner(); } public static Inner getInner1() { // 也可以是静态方法 return new Inner(); } }
-