Java(Android)方法中匿名内部类使用方法的参数

本文探讨了匿名内部类在Java中的使用方式及其与final参数的关系。解释了为什么当匿名内部类需要访问外部方法的局部变量时,这些变量必须声明为final。通过实例展示了匿名内部类如何保存外部方法变量的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

匿名内部类一般定义在一个方法的内部,如果要访问该方法的参数或者方法中定义的变量,则这些参数或者变量必须使用final修饰


虽然匿名内部类定义在方法的内部,但在编译时内部类与外部类中的方法属于同一个级别,外部类中方法的变量或参数只是方法的局部变量,这些变量或者参数的作用域只在当前方法内部有效。但是如果这些变量用final修饰,内部类就可以保存方法变量的备份,即使方法销毁也能保证内部类在访问时不会出现访问不到的错误。

匿名内部类要访问局部变量,但是函数的局部变量在执行完后会立即退出,销毁掉所有临时变量。而产生的匿名内部类可能会保留.


匿名内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。 这样理解就很容易得出为什么要用final了,因为两者从外表看起来是同一个东西,实际上却不是这样,如果内部类改掉了这些参数的值也不可能影响到原参数,然而这样却失去了参数的一致性,因为从编程人员的角度来看他们是同一个东西,如果编程人员在程序设计的时候在内部类中改掉参数的值,但是外部调用的时候又发现值其实没有被改掉,这就让人非常的难以理解和接受,为了避免这种尴尬的问题存在,所以编译器设计人员把内部类能够使用的参数设定为必须是final来规避这种莫名其妙错误的存在。

public void showAlertDialog(String title,String msg,final int flag){

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title);
builder.setMessage(msg);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (
flag) {
case DIALOG_CHANGEOVERAGE:


break;
case DIALOG_SETINSERT:


break;
case DIALOG_SETOVERAGE:


break;
default:
break;
}
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
});
builder.show();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值