Java 本地方法内部类 的详细介绍

本地方法内部类的介绍:
分布 写法 形式:写在 一个外部类 方法的内部。 这个方法可以是 实例方法 也可以是 静态方法。
注意事项:
01:写在了方法的内部 , 就跟当前的方法内部的局部变量是一个级别。
==》因此不可以有任何修饰符号 除了final abstract 之外!!!!

02:局部方法不可以使用 可见性修饰符修饰 变量,因此这个方法本地的内部类,也不可以使用。

03: 本地方法内部类 于外部类之间 的关系 不是:在 创造 内部类对象 之前必须有一个外部类对象,这种关系。 它的关系:因为我是一个本地方法内部类,所以更像是一个方法一样,我可以访问外部类中的数据。 但是分情况处理, 写在 实例方法内部类 和 写在静态方法的内部类不是一回事。
A:由于 本地方法内部类 写在了方法中 ,并不会被立马加载 ,所以这个内部类不可以有任何 的 静态的成员 (此时方法本地内部类,只可以是常规内部类的写法,或者是匿名内部类的写法,因为方法内部不可以有静态的修饰符,所以不会存在静态内部类的写法);

B1:写在 实例方法 的 内部类,可以访问这个方法本身的局部变量,但是被访问的成员变量必须加上final。(尽管jdk经过进化之后 可以省略了,但是还是加上 翻遍阅读)

B2:写在 实例方法 的 内部类, 也可以直接访问 当前外部类中的 任何 任何 任何 成员: 静态变量 实例变量 , 实例方法 , 静态方法。
当访问静态方法 和 静态变量 的时候 规范 使用 外部类类名.要访问的内容 的形式去访问;
当访问实例方法 和 实例变量 的时候 使用 外部类名字 . this . 要访问的内容 的形式。
当访问自身的任何 。
==》这点跟 常规内部类访问外部类的形式是一样的。

C1:写在 静态方法的内部类 ,因为写在了静态方法内,会受到很多限制 这个静态方法不可以访问 类中的实例变量, 所以说写在静态方法的方法本地内部类 也不可以访问到 这个外部类的实例变量(除非自己new一个外部类对象,然后调用。),而只可以访问 外部类的静态变量 , 但是要注意写法形式 使用外部类名字的形式去访问 外部类的静态变量。

----备注:特别注意: 在静态方法中的内部类, 必须是常规内部类,不可以是静态的常规内部类,因为java虚拟机只会加载这个 静态方法 ===》等待随时被类对象调用, 而不会 去直接执行 这个静态方法内部的代码【也就是说 不会加载这个静态类】,所以说即便是 在静态方法中写了一个静态内部类,那么依然不会被虚拟机加载,那么这样的写法是错误的,也是不合法的。

C2:当访问 静态方法 中的 局部变量的时候 局部变量 要加final修饰符。

03:这个方法本地内部类,写在了方法的内部, 就是一个局部变量,它的作用域 局限于在方法的大括号内部,这个大括号执行完了,方法内部的局部变量就消失了,但是这个内部类的对象,并没有消失 还存在域堆内存中,但是如下解释:
本地方法内部类 只可以仅仅可以 在定义该内部类的方法内部实例化(内部类所处的方法内实例化), 在任何其他方法的任何代码内(无论是外部类内 还是不相干的类)都不可以实例化本地方法的内部类, 因为此时这个内部类,就犹如 一个方法内的局部变量。

04:在内部类所处的本地方法内, 是先声明 一个内部类,然后才 new这个内部类创造一个内部类实例对象。类似一个变量先声明 在赋值 后使用的道理。

06:这个本地方法内部类,只可以具备实例方法和实例数据域,不可以具备静态方法和静态数据域。因为 没有意义,也不合法。

07:这个本地方法内部类,可以继承 自己的 接口 , 抽象类 ,常规类, 并且可以可以重写他们父类的方法,可以有自己的构造方法,当创建内部类实例的时候,会沿着构造方法链一致进行西下去。

08:只可以被 final修饰 但是有啥意义?

09:访问本地方法的局部变量 , 那么局部变量必须加上 final修饰符修饰,具体原因:
本地方法运行之后,它的栈帧就被移除了,里面的本地变量也都被清除了,这时候匿名内部类中再使用这个变量不会有问题吗?原来,在内部类中使用外部方法中的 final 本地变量和 final 形参时,编译器会去“捕获”它们,会存一份拷贝在内部类中,这样的话,即使方法的栈帧被清除了,内部类中仍然保存着它的拷贝,仍然能访问它。 因为 这个方法本地内部类 在方法内部,所以 传入进入的方法内的变量,我们不可以在 静态类中去改变它。 因为依然在这个方法作用域内!!!!!!

09: 实例方法可以 具备 内部类,因为 内布类 跟 外部类实例 有一中隐含的关系,所以这里不必,重新new一个外部类对象了,因为所处的位置是在,实例方法之内,就说明了,要调用这个实例方法的时候,已经创造了一个外部类的实例对象。如下图:
在这里插入图片描述

但是 由于是在静态方法内的 , 静态方法本来只可以访问 外部类的 静态数据域, 那么此时 处于静态方法中的内部类,只可以访问 外部类 的静态数据域,(访问外部类的静态方法,那是静态方法的事情) 访问静态方法的局部变量 必须加final修饰符, 访问内部类对象自己的变量 和 方法 跟上面所述相同。
在这里插入图片描述
===>> 因此我们总结:在方法本地 创造 内部类对象 的形式: 内部类名字 变量名字 = new 内部类名字();

—:注意并没有提到说 当方法本地的局部变量 和 内部类 有重复的名字的时候我们该如何去访问方法中的局部变量。
答案:是根本访问不到的。
原因: 在本地方法内部类中 访问 到 方法 的局部变量(使用final修饰的)的时候,避免 方法执行而完了之后 弹栈,导致 此时 这个本地方法内部类 无法访问 到 所处的 这个方法的局部变量, 所以虚拟机 会提前复制一份 到这个 本地方法内部类中 ,隐式的作为 这个本地方法内部类 的 变量作用域 使用。 所以当这个本地方法内部类 中存在 一个同名的 变量那么就相当于是覆盖掉了 虚拟机 复制的哪个变量啦,所以访问不到!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

15737443266

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值