内部类
内部类
此系列笔记来源于
BiliBili韩顺平老师的Java基础课
介绍
一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类,嵌套其他类的类称为外部类。内部类最大的特点是可以直接访问私有属性,并且可以体现类与类之间的包含关系
分为:局部内部类、匿名内部类、成员内部类和静态内部类四种
基本语法
class Outer { //外部类
class Inner { //内部类
}
}
class wuhu { //外部其他类
}
分类
定义在外部类局部位置上(比如方法内):
1、局部内部类(有类名)
2、匿名内部类(没有类名,重点)
定义在外部类的成员位置上:
1、成员内部类(无static修饰)
2、静态内部类(有static修饰)
局部内部类
定义在外部类的局部位置(通常在方法中),有类名。
1、局部类可以直接访问外部类的所有成员,包含private的;外部类在内部类的作用域中,可以创建内部类的实例对象,来调用。
2、不能添加访问修饰符,因为其地位是一个局部变量。 局部变量不能添加访问修饰符,但是可以用 final 修饰
3、作用域:仅仅在定义它的方法或代码块中
4、外部其他类 不能访问 局部内部类
5、如果外部类和局部内部类的成员重名时,默认遵循就近原则。如果想访问外部类的成员,可以使用 外部类名.this.成员 来访问
外部类名.this 与 外部类的对象地址一致
匿名内部类
(1)本质是类 (2)内部类 (3)该类没有名字 (4)同时还是一个对象
基本语法:
//两种调用方法
XX xx = new 类 或 接口(参数列表) {
类体
}
---------------------------------------------
new 类 或 接口(参数列表) {
类体
}.方法名();
作用:利用匿名类我们可以不通过创建实例对象来使用接口(只能用一次)
jdk底层会创建一个匿名内部类 Outer04$1 以及其实例对象,并返回地址
参数列表会自动传递给构造器
该匿名内部类是子类,通过super能调用XX类的成员
细节
1、可以直接访问外部类的所有成员,包含private
2、不能添加访问修饰符,因为其为局部变量
3、作用域:仅在定义它的方法和代码块中
4、外部其他类不能访问匿名内部类
5、如果外部类和匿名内部类的成员重名时,默认遵循就近原则。如果想访问外部类的成员,可以使用 外部类名.this.成员 来访问
外部类名.this 与 外部类的对象地址一致
匿名内部类实践
1、当做实参直接传递
方法以接口或类作为形参类型,可以直接将匿名内部类当做实参
//调用方法,将匿名内部类直接作为实参
f(new IA() {
public void wuhu() {
...
}
});
//定义静态方法,形参是接口类型
pulic static void f(IA ia) {
ia.wuhu();
}
//相当于通过匿名内部类,代替了class xx implements
成员内部类
成员内部类定义在外部类的成员位置,并且没有static修饰
1、可以直接访问外部类的所有成员,包含private的
2、可以添加任意访问修饰符(public、protected、默认、private),因为它的地位就是一个成员
3、作用域:为整个类体
4、外部类 访问 成员内部类:创建对象,再访问
5、外部其他类 访问 成员内部类:
① 通过外部类.内部类 的对象调用
//1
Outer a = new Outer();
Outer.Inner xx = a.new Inner();
//2
Outer.Inner xx = new Outer().new Inner();
② 在外部类中写一个方法,可以返回成员内部类的对象
Outer.Inner xx = new Outer().getInnerInstance();
class Outer {
class Inner {
...
}
public Inner getInnerInstance() {
return new Inner();
}
}
6、如果外部类和内部类的成员重名时,默认遵循就近原则。如果想访问外部类的成员,可以使用 外部类名.this.成员 来访问
静态内部类
静态内部类也定义在外部类的成员位置,并且有static修饰
1、可以直接访问外部类的所有成员,包含private的,但不能直接访问非静态成员
2、可以添加任意访问修饰符,因为它的地位就是一个成员
3、作用域:为整个类体
4、静态内部类 访问 外部类:直接访问所有静态成员
5、外部类 访问 静态内部类:创建对象,再访问
6、外部其他类 访问 静态内部类:
① 通过外部类.内部类 的对象调用
静态内部类可以通过类名直接访问(满足访问权限)
Outer.Inner x = new Outer.Inner();
② 在外部类中写一个方法, 可以返回静态内部类的对象
Outer.Inner xx = new Outer().getInnerInstance();
//静态方法写法
Outer.Inner xx = Outer.getInnerInstance();
class Outer {
static class Inner {
...
}
public Inner getInnerInstance() {
return new Inner();
}
}
7、如果外部类和内部类的静态成员重名时,默认遵循就近原则。如果想访问外部类的成员,可以使用 外部类名.成员 来访问