内部类

内部类

此系列笔记来源于

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、如果外部类和内部类的静态成员重名时,默认遵循就近原则。如果想访问外部类的成员,可以使用 外部类名.成员 来访问

posted @ 2022-03-24 23:33  Yra  阅读(102)  评论(0编辑  收藏  举报