Java----内部类 以及 调用关系
目录标题
- **一.内部类**
- **一.内部类定义**
- 二.**内部类** 与 **继承类** 之间的区别
- ①定义 与 作用
- ②访问权限
- 二.内部类的**类型**
- ①普通内部类
- ②静态内部类
- ③局部内部类
- 要点
- **二、内部类的核心优势**
- **三.调用关系**
- 一.**外部类**访问**内部类**
- 二.**内部类**调用**外部类**
一.内部类
一.内部类定义
与 普通类 的定义 相同
[访问修饰符] [存储修饰符] class 类名
{……
}
①内部类 也可以有 成员变量 和 成员方法
②内部类 整体也可以被当做 外部类 的一个 成员 使用
③因此也可以调用 外部类 的 成员(成员变量、成员方法)
二.内部类 与 继承类 之间的区别
①定义 与 作用
-
内部类 : 定义方法及为普通方法的定义
为了更好的保护内容,增强封装性 -
继承类 : 用
extends
实现类与类的 继承
为了 继承 并可以 扩写 父类内容
②访问权限
- 内部类 : 可以访问自生所在 外部类 的所有成员,包括**(**
private
修饰的),但 外部类 不可以直接访问 内部类 的成员 - 继承类 : 可以直接访问父类中 除了由
private
修饰 的成员,若想访问,需要由 父类的实例 (对象)访问
二.内部类的类型
①普通内部类
- 定义为 外部类 的成员,与 外部类 的 成员方法、成员变量 同级
- 可访问外部类的 所有成员
class Outer
{private int x = 10; class Inner { void show() { System.out.println(x); // 直接访问外部类私有变量 } }
}
②静态内部类
- 使用
static
修饰的 内部类 - 只能访问外部类的 静态成员
class Outer
{static int y = 20; int x = 100; static class StaticInner { void display() { System.out.println(y); // 只能访问静态成员 } }
}
③局部内部类
- 存储在 方法 或者 作用域内
- 只能访问所在方法的 final 或者 与 final 等效的 局部变量
class Outer
{void method() { final int z = 30; //内部类class LocalInner { //内部类 的方法void print() { System.out.println(z); } } //创造内部类的实例 并 调用方法new LocalInner().print(); }
}
要点
编译完成后,会生成两个class
文件(数量为类的数量),因为内部类也以独立的文件**(class文件)**存储在磁盘中,名称为
外部类名 $内部类名.class
二、内部类的核心优势
- 增强封装性
- 内部类可声明为
private
,仅对外部类可见 - 外部类同样可以声明为
private
,仅对本类内可用,包括内部类
- 直接访问外部类成员
- 内部类隐式有外部类引用(静态内部类除外)
- 实现多重继承
- 通过多个内部类继承不同父类
三.调用关系
一.外部类访问内部类
需要创建内部类的实例(对象)
方法一:
内部类名 对象名 = new 外部类名.内部类名();
或
先创建外部类实例再由此创建内部类实例
外部类名 外部对象名 = new 外部类名();
外部类名.内部类名 内部对象名= 外部对象名.new 内部类名();
//例
Outclass out = new OutClass();
OutClass.InClass in = out.new InClass();
class Out
{ //内部类class In{//内部类的方法void First(){System.out.println("内部类的内容");}}//外部类 调用 内部类//先创建 内部类的 实例In in = new Out.In();//引用 内部类 内容in.First();
}
二.内部类调用外部类
直接调用即可
但当内部类中有与要引用的外部类内容重名时
可如下使用显示引用
class Outer
{private int x = 10; //内部类class Inner{ void show() {// 显式访问 System.out.println(Outer.this.x); // 隐式访问System.out.println(x); } }
}