首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从匿名内部类更改side方法中的变量值?

从匿名内部类更改side方法中的变量值,可以通过将变量声明为final或使用Java 8引入的Effectively Final的特性来实现。

  1. 将变量声明为final:在匿名内部类中,只能访问外部方法中被声明为final的变量。因此,可以将需要修改的变量声明为final,并在匿名内部类中访问并修改该变量的值。示例代码如下:
代码语言:txt
复制
public void side() {
    final int value = 10;
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            // 修改value的值
            // value = 20;  // 编译错误,final变量不可修改
            System.out.println("Before modification: " + value);
            // 修改value的值
            // 注意:在匿名内部类中,只能访问final变量的值,不能修改
            // 如果需要修改变量的值,可以使用数组或容器类来存储变量,并通过修改数组或容器类的元素来实现
            // 例如:int[] arr = {value}; arr[0] = 20;
            System.out.println("After modification: " + value);
        }
    };
    Thread thread = new Thread(runnable);
    thread.start();
}
  1. 使用Effectively Final特性(Java 8及以上):在Java 8中,引入了Effectively Final的概念,即在匿名内部类中可以访问并修改被隐式声明为final的变量。这意味着,如果变量在匿名内部类中没有被重新赋值,即被视为final,可以在匿名内部类中访问并修改该变量的值。示例代码如下:
代码语言:txt
复制
public void side() {
    int value = 10;  // 注意:没有使用final关键字
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            // 修改value的值
            value = 20;  // 此处可以修改变量的值
            System.out.println("Before modification: " + value);
            // 修改value的值
            value = 30;  // 此处可以再次修改变量的值
            System.out.println("After modification: " + value);
        }
    };
    Thread thread = new Thread(runnable);
    thread.start();
}

需要注意的是,以上两种方法都是通过在匿名内部类中访问外部方法中的变量来实现修改。在匿名内部类中修改变量的值后,外部方法中的变量值也会相应改变。

关于匿名内部类、final变量和Effectively Final的更多详细信息,可以参考腾讯云开发者手册中的相关文档:

  • 匿名内部类:https://cloud.tencent.com/developer/doc/1101
  • final关键字:https://cloud.tencent.com/developer/doc/1102
  • Effectively Final特性:https://cloud.tencent.com/developer/doc/1103
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java匿名部类使用(仅限介绍实际使用两种方法)

使用场景: 匿名部类可以使你代码更加简洁,你可以在定义一个类同时对其进行实例化。它与局部类很相似,不同是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名部类。...使用步骤 定义匿名部类 匿名部类语法 访问作用域局部变量、定义和访问匿名部类成员 匿名部类实例 两种案例类型 实现接口匿名匿名子类(继承父类) 运行结果: 运行结果: 匿名部类访问其外部类方法...动物 布谷鸟 以上两个实例可知,匿名类表达式包含以下内部分: 操作符:new; 一个要实现接口或要继承类,案例一匿名类实现了HellowWorld接口,案例二匿名部类继承了Animal...父类; 一对括号,如果是匿名子类,与实例化普通类语法类似,如果有构造参数,要带上构造参数;如果是实现一个接口,只需要一对空括号即可; 一段被"{}“括起来类声明主体; 末尾”;"号(因为匿名声明是一个表达式...,是语句一部分,因此要以分号结尾)。

45820

读书笔记 | 类使用 | Effective Java 3

不能访问外层方法本地变量。除非变量是 final,或是数组形式(不受编译器控制) 如果内部类名称和外面能访问名称相同,则会把名称覆盖掉。...匿名可以包含东西有:字段、方法、实例初始化代码、本地类 匿名不可以包含东西有: // 匿名类示例 public class Test { public void test() {...在一个方法定义。在任何“可以声明局部变量”地方,都可以声明局部类。...} public void test(){ class AA{}//方法部类 } } //注意到了吧,可以同名,编译后,形成诸如:外部类名称+$+同名顺序+...正如你所预料那样,该关联在非静态成员类实例占用了空间,并为其构建添加了时间开销。 那么如何使用更好呢?

35320

【Java】final关键字&权限修饰符&内部类&引用类型用法

局部变量 —— 引用类型 引用类型局部变量,被 fifinal 修饰后,只能指向一个对象,地址不能再更改。但是不影响对象成员变量值 修改,代码如下: 3....比如, Person$Heart.class 3.2 匿名部类【重点】 匿名部类 :是内部类简化写法。它本质是一个 带具体实现 父类或者父接口 匿名 子 类对象 。...开发,最常用到部类就是匿名部类了。以接口举例,当你使用一个接口时,似乎得做如下 几步操作, 1. 定义子类 2. 重写接口中方法 3....调用重写后方法 我们目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名部类 就是做这样快 捷方式。...格式 使用方式 以接口为例,匿名部类使用,代码如下: 定义接口: 创建匿名部类,并调用: 通常在方法形式参数是接口或者抽象类时,也可以将匿名部类作为参数传递。

40350

Java基础:Java类与对象

在具有特殊性 RushOrder 类包含了一些用于优先处理特殊方法,以及一个计算运费不同方法;而其他方法,如添加商品、生成账单等都是 Order 类继承来。...,这些变量只能赋值一次; final 修饰引用类型变量值为对象地址值,地址值不能更改,但是地址对象属性值可以修改; final 修饰成员变量,必须在创建对象前赋值,或在多个构造方法中进行赋值,否则报错...2、内部类分类 内部类分为 成员内部类 与 局部内部类其次还有 匿名部类、静态内部类: 成员内部类:定义在外部类成员位置,与类成员变量相似,可通过 外部类.对象 进行访问,访问方式: 外部类名...Ps:①匿名部类是没有访问修饰符;②匿名部类必须继承一个类(可以是 具体类也可以是抽象类) 或者实现一个接口;③匿名部类不能存在任何静态成员或方法;④匿名部类是没有构造方法,因为它没有类名;⑤...匿名部类为局部内部类,所以局部内部类所有限制同样对匿名部类生效;⑥匿名部类不能是抽象,所以,它必须要实现继承类或者实现接口所有抽象方法 静态内部类:使用static修饰成员内部类我们称之为静态内部类

43440

java初级笔记----final、static、匿名对象、内部类

(也就是说,多个对象在访问或修改static修饰成员变量时,其中一个对象将static成员变量值进行了修改,其他对象static成员变量值跟着改变,即多个对象共享同一个static成员变量)...静态方法只能访问静态成员,如果静态方法引用到了静态其他成员,那么这个方法需要声明为静态方法。 4、 在多态,非静态编译看父类,运行看子类,父类没有编译失败。...但多态静态方法,编译看父类,运行仍然看父类。因为静态和对象没有关系,属于静态绑定。 三、匿名对象 匿名对象是指创建对象时,只有创建对象语句,却没有把对象地址值赋值给某个变量。...例:new Person(); 1、只能使用一次 2、匿名对象可以作为方法接收参数、方法返回值使用 四、内部类 将类写在其他类内部,可以写在其他类成员位置和局部位置,这时写在其他类内部类就称为内部类...//调用外部类puffBall方法 p.puffBall(); } 六、匿名部类 匿名部类本质是一个实现了接口或继承了某个类子类匿名对象. public

82530

Java 内部类及其原理

如用private修饰,则只能在外部类内部访问。 2.局部内部类 局部内部类是定义在一个方法或作用域中类,它访问权限仅限于方法或作用域。 ? 局部内部类也可以返回,像这样: ?...匿名部类在编译时候有系统自动起名:Main$1 匿名部类是没有构造器类,大部分用于继承其他类或实现接口,并不需要增加额外方法,只是对继承方法实现或是重写 4.静态内部类 静态内部类也是定义在另一个类里面的类...其实可以这样想,当方法执行完毕后,局部变量生命周期就结束了,而局部内部类对象生命周期可能还没有结束,那么在局部内部类访问局部变量就不可能了,所以将局部变量改为final,改变其生命周期。...可以看到,java将编译时已经确定值直接复制,进行替换,将无法确定值放到了内部类常量池中,并在构造函数中将其常量池取出到字段。...可以看出,java将局部变量m直接进行复制,所以其并不是原来值,若在内部类中将m更改,局部变量m值不会变,就会出现数据不一致,所以java就将其限制为final,使其不能进行更改,这样数据不一致问题就解决了

54140

【Java基础】类成员总结(属性,方法,构造器,代码块,内部类

1.属性 属性 = 成员变量 = field = 域、字段 类属性使用: 属性(成员变量) vs 局部变量 1.相同点: 1.1 定义变量格式:数据类型 变量名 = 变量值 1.2...先声明,后使用 1.3 变量都有其对应作用域 2.不同点: 2.1 在类声明位置不同 属性:直接定义在类一对{} 局部变量:声明在方法方法形参、代码块、构造器形参、构造器内部变量...对对象属性等进行初始化 如果一个类定义了多个非静态代码块,则按照声明先后顺序执行 非静态代码块可以调用静态属性、静态方法,或非静态属性、非静态 5.内部类 在Java,可以将一个类定义在另一个类里面或者一个方法里边...3.匿名部类 (1)一般使用匿名部类方法来编写事件监听代码; (2)匿名部类是不能有访问修饰符和static修饰符; (3)匿名部类是唯一一种没有构造器类; (4)匿名部类用于继承其他类或是实现接口...在Java,可以将一个类定义在另一个类里面或者一个方法里边,这样类称为内部类,广泛意义上部类一般包括四种:成员内部类,局部内部类匿名部类,静态内部类

47830

Java 内部类意义及应用

由于静态内部类内部只能访问它外部静态成员,而对于访问权限可见情况下,这两个类本质上毫无关联,但如果像我们此例部类属性 name 而言,它本身被修饰为 private,不可见于外部任何类。...局部内部类 局部内部类就是在代码块定义一个类,最典型应用是在方法定义一个类。...如果方法是实例方法,那么方法部类可以访问外围类任意成员,如果方法是静态方法,那么方法内部部类只能访问外围类静态成员。...我们反编译结果来看,局部内部类只保存这些变量数值,而不是内存地址,并且也不允许更改,那么如果外部这些变量可更改,将直接导致每个新建内部类实例具有不同属性值,所以直接给声明为 final,...其实你编译器层面上看,匿名部类和一个实际类型相差无几,它也能继承某个类并重写其中方法,实现某个接口所有方法等。最吸引人可能就是它无需单独创建类文件简便性。

1K40

笔记10 | 学习整理静态static 和 终态final

使用静态方法有以下几点限制: 1、静态方法只能调用静态方法,不能调用非静态方法; 2、静态方法只能使用静态类变量,不能使用非静态类变量; 3、静态方法不能使用this和super,即使this...例如Color类BLACK、WHITE、RED、GREEN、BLUE等常量; 3、匿名部类局部变量。因为匿名部类在编译时是与方法平级,所以不能调用方法变量,只能调用类变量。...如果匿名部类一定要调用方法变量,那得声明该变量是final类型,即把该变量当作一个常量来用。...匿名部类说明参见《Android开发笔记(八十六)几个特殊类》 final变量初始化有三种途径: 1、在声明final变量时,就给它赋初始值; 2、在类构造函数,给final变量赋值; 3、...在静态代码块,给final变量赋值; 下面是在匿名部类中使用final变量代码例子: @Override public void onClick(View v) { tv_expand.setText

42650

Android开发笔记(八十七)几个修饰关键字

使用静态方法有以下几点限制: 1、静态方法只能调用静态方法,不能调用非静态方法; 2、静态方法只能使用静态类变量,不能使用非静态类变量; 3、静态方法不能使用this和super,即使this...例如Color类BLACK、WHITE、RED、GREEN、BLUE等常量; 3、匿名部类局部变量。因为匿名部类在编译时是与方法平级,所以不能调用方法变量,只能调用类变量。...如果匿名部类一定要调用方法变量,那得声明该变量是final类型,即把该变量当作一个常量来用。...匿名部类说明参见《Android开发笔记(八十六)几个特殊类》 final变量初始化有三种途径: 1、在声明final变量时,就给它赋初始值; 2、在类构造函数,给final变量赋值...; 3、在静态代码块,给final变量赋值; 下面是在匿名部类中使用final变量代码例子: @Override public void onClick(View v) {

51720

夯实Java基础系列18:深入理解Java内部类及其实现原理

让他成为主类实例一部分 然后又想在内部类声明和实例无关静态东西 你让JVM情何以堪啊 4 若想在内部类声明静态字段 就必须将其内部类本身声明为静态 非静态内部类有一个很大优点:可以自由使用外部类所有变量和方法...//所有普通部类与类一个变量是类似的。静态内部类则与静态成员类似。 } } 内部类加载 可能刚才例子没办法直观地看到内部类如何加载,接下来用例子展示一下内部类加载过程。...需要注意是: 局部内部类只能在定义该内部类方法实例化,不可以在此方法外对其实例化。...直到这里还没有解释为什么是final 在内部类属性和外部方法参数两者外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化,也就是说在内部类我对属性改变并不会影响到外部形参,而然这程序员角度来看这是不可行...,进行替换,将无法确定值放到了内部类常量池中,并在构造函数中将其常量池取出到字段

1.2K10

部类, 静态内部类, 局部类, 匿名部类解析和区别

(让多个内部类分别继承多个其他类,使外部类可以同时获取多个其他类属性) 4.可以避免修改接口而实现同一个类两种同名方法调用。...: 指内部类定义在方法体内,只能在该方法或条件作用域才能使用,退出这写作用域就无法引用。...这里Java采用了一种copy local variable方法实现,定义为final变量,会拷贝一份存到局部内部类,后续使用持续维护这个对象在生命周期内,所以可以继续访问。...注:final可以修饰范围有类,方法,属性。修饰类,该类不可以被继承;修饰方法,该方法不可以被子类重写;修饰变量,该变量值不能被修改。...3)、匿名部类: 为了免去给内部类命名,或者只想使用一次,就可以选择使用匿名部类

2.3K11

夯实Java基础系列18:深入理解Java内部类及其实现原理

让他成为主类实例一部分 然后又想在内部类声明和实例无关静态东西 你让JVM情何以堪啊 4 若想在内部类声明静态字段 就必须将其内部类本身声明为静态 非静态内部类有一个很大优点:可以自由使用外部类所有变量和方法...//所有普通部类与类一个变量是类似的。静态内部类则与静态成员类似。 } } 内部类加载 可能刚才例子没办法直观地看到内部类如何加载,接下来用例子展示一下内部类加载过程。...需要注意是:局部内部类只能在定义该内部类方法实例化,不可以在此方法外对其实例化。...直到这里还没有解释为什么是final 在内部类属性和外部方法参数两者外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化,也就是说在内部类我对属性改变并不会影响到外部形参,而然这程序员角度来看这是不可行...可以看到,java将编译时已经确定值直接复制,进行替换,将无法确定值放到了内部类常量池中,并在构造函数中将其常量池取出到字段

40810

Android-Lambda表达式

这其实也是Lambda表达式优点:其对匿名部类笨拙繁琐代码简化.lambda 表达式不仅对对象名进行隐匿,更完成了方法隐匿,展示了一个接口抽象方法最有价值两点:参数列表和具体实现....lambda 表达式就是对这类接口匿名部类进行简化。...因为我们并不知道所实现接口方法何时会被调用,所以通过设立 final 来确保安全。在 lambda 表达式,仍然需要遵守这个标准。...不过在 Java 8 ,新增了一个 effective final 功能,只要一个变量没有被修改过引用(基本变量则不能更改变量值),即为实质上 final 变量,那么不用再在声明变量时加上 final...2.2 this 关键字 在匿名部类,this 关键字指向匿名类本身对象,而在 lambda ,this 指向是 lambda 表达式部类

66120

kotlin基础语法

*/ 字符串模板 $ 表示一个变量名或者变量值 $varName 表示变量值 ${varName.fun()} 表示变量方法返回值: 数据类型 类型 位宽度 Double 64 Float 32...默认最直接包围它函数或者匿名函数 返回。 break。终止最直接包围它循环。 continue。继续下一次最直接包围它循环。...internal // 同一个模块可见 继承 Kotlin 中所有类都继承该 Any 类,它是所有类超类,对于没有超类型声明类是默认超类: class Example // Any 隐式继承...如果你使用匿名对象作为公有函数 返回类型或者用作公有属性类型,那么该函数或属性实际类型 会是匿名对象声明超类型,如果你没有声明任何超类型,就会是 Any。在匿名对象 添加成员将无法访问。...类委托 类委托即一个类定义方法实际是调用另一个类对象方法来实现

2.1K20

Java知识面试题复习(三)Java面向对象

,在某个范围其值可以发生改变量。...本质上讲,变量其实是内存一小块区域 成员变量:方法外部,类内部定义变量 局部变量:类方法变量。 成员变量和局部变量区别 作用域 成员变量:针对整个类有效。...局部内部类创建方式,在对应方法,new 内部类(),如下: public static void testStaticFunctionClass(){ class Inner {...匿名部类不能定义任何静态成员和静态方法。 当所在方法形参需要被匿名部类使用时,必须声明为 final。 匿名部类不能是抽象,它必须要实现继承类或者实现接口所有抽象方法。...一个方法可以修改传递引用所对应变量值,而不能修改传递值调用所对应变量值。 它用来描述各种程序设计语言(不只是Java)中方法参数传递方式。 Java程序设计语言总是采用按值调用。

35930

【师兄笔记】Java入门

,public,throws,等等 Java标识符 就是用于给Java程序变量,类,方法等命名符号 变量=变量类型、变量名以及变量值 String 变量类型 hobby 变量名 = ”网“ 变量值...; } 如何定义Java方法 一般语法是: 访问修饰符 返回值类型 方法名(参数列表){    方法体 } java无参无返回值方法使用 public void show(){      System.out.println...2.局部变量 在类方法定义,在方法临时保存数据。...类一个用来初始化对象方法 构造方法与类同名且没有返回值 语法格式: public 构造方法名(){ //初始化代码 } Javastatic 使用之静态变量。...内部类分:成员内部类,静态内部类方法部类匿名部类 使用try...catch...finally处理异常 try{ //抛出异常 }catch(Exception e){ //代码块异常 } Java

16830

Java高级编程:闭包

2.1 内部类 在JAVA,内部类可以访问到外围类变量、方法或者其它内部类等所有成员(即使它被定义成private了)但是外部类不能访问内部类变量。...md.runThread().run(); } } 2.3 匿名部类 在Java方法返回一个被直接实例化对象则称为匿名部类。...匿名部类没有类名,但是拥有更加简介代码块、并且同样需要重写接口类方法匿名部类同样属于内部类一种。...().run(); } } 2.4 内部不可变 在Java,被内部类直接调用变量一般都加以 final 进行修饰,以表示为一个恒定不变值,即创建后便不能被更改。...如果我们在闭包修改了这个对象某个属性值,那么就会造成这个对象值被全局污染使得其他方法在调用该 王五 对象时发现参数被修改了,同样的如果在多线程,不论是外部方法还是闭包本身造成数据污染都会导致数据不一致性

68730

Variable used in lambda expression should be final or effectively final

lambda表达式做修改原变量值操作。 ...在 Java 8 之前,匿名如果要访问局部变量的话,那个局部变量必须显式声明为 final,如下代码在 Java 7 是编译不过 但是finalI并没有声明为final类型,然而代码却能够编译通过...java 中局部内部类匿名部类访问局部变量必须由 final 修饰,以保证内部类和外部类数据一致性。...可以在匿名部类中直接使用非 final 变量,而 final 修饰局部变量不能在被重新赋值  也就是说 Java 8 开始,它不要求程序员必须将访问局部变量显式声明为 final 。...总结一下,规则没有改变,Lambda 表达式和匿名部类访问局部变量必须是 final ,只是不需要程序员显式声明变量为 final ,从而节省时间。

37450
领券