- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
匿名内部类只能使用外部方法的局部常量
原因如下:
对象的生命周期与局部变量不同,局部变量的生命周期不超过方法的作用域,即方法执
行完毕后,方法栈中的所有局部变量都将被JVM 回收。而对象是在没有引用变量指向时,才
会由JVM 回收。若方法执行完毕后,匿名内部类仍由方法之外的引用变量指向,则该对象仍
会存在,但该对象又使用了方法中的某个局部变量,该局部变量是应该回收?还是不回收?
为解决这个矛盾。Java 会在匿名内部类中隐含地创建一个同类型的变量,将局部变量的值
赋值给该变量,则匿名内部类使用的变量是这个隐含的变量,该变量与匿名内部类的生命周
期相同。这就解决了以上的矛盾。即匿名内部类之外的方法执行完毕后,JVM 会正常的将方
法中的所有变量回收。而不影响匿名内部类。
因此,代码上我们看到的匿名内部类使用的是外部方法的局部变量,实际上使用的是那
个隐含的变量。
但这又会出现一个新的问题,若我们在匿名内部类中修改该变量的值,实际上是不会影
响外部方法中的局部变量,但代码上看上去,就会出现一个“变量”有两个值的情况。为此,
Java 硬性规定:这种变量的值不允许修改,所以就必须声明为常量。
【示例-6】
匿名内部类中若使用外部方法的局部变量,则该局部变量必须改为常量类型
package com.ityw.se1.day01;
import com.ityw.oop.day03.usb.USB;
import com.ityw.se1.day01.entity.Computer;
public class Test06 {
/**
* 匿名内部类中若使用外部方法的局部变量,则
* 该局部变量必须改为常量类型。
*/
//创建静态成员变量computer
static Computer computer=new Computer();
public static void main(String[] args) {
//创建外部类的实例
Test06 test06=new Test06 ();
//调用createScanner()向集合computer.usbs添加一个扫描仪对象
test06.createScanner();
//调用扫描仪的读写方法
computer.usbs [0].read();
computer.usbs [0].write();
}
//createScanner创建一个扫描仪对象,该对象实现了USB接口
void createScanner(){
//设置为常量类型
final StringBuilder scannerName=new StringBuilder(扫描仪);
//创建匿名内部类,并将地址保存在接口变量scanner中
USB scanner=new USB() {
@Override
public void write() {
System.out.println(scannerName+将扫描的数据发送至主机);
}
@Override
public void read() {
System.out.println(scannerName+在扫描纸质文件);
}
};
//将匿名内部类的地址添加至数组中
computer.usbs [0]=scanner);
} //createScanner()结束处
}
说明:
1、在Test06 类中声明了一个Computer 类型的静态对象computer。
2、在Test06 类中声明了一个方法createScanner,该方法负责创建一个实现了USB 接
口的扫描仪对象,该对象以匿名内部类的方式创建,并将对象地址赋值给方法中的局部变量
scanner。
createScanner 将创建的匿名内部类的地址存放在了computer.usbs[0]中。
3、该匿名内部类使用了外部方法createScanner 中的一个局部变量sca
文档评论(0)