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

局部变量不能在内部类中使用。那么,为什么这段代码可以工作呢?

这段代码可以工作的原因是因为局部变量在内部类中被隐式地转换为final变量。在Java中,当一个局部变量被内部类引用时,Java编译器会将该局部变量复制一份作为内部类的成员变量,并将其标记为final。这样做的目的是为了确保内部类在访问局部变量时,能够获取到一个固定的值,而不会受到外部方法中局部变量的改变影响。

由于内部类中的局部变量被转换为final变量,所以即使在内部类中访问的是复制后的成员变量,也不会受到外部方法中局部变量的改变影响。这样就保证了内部类中使用的局部变量的值是固定的,不会发生变化。

需要注意的是,这种转换只适用于局部变量,对于实例变量或静态变量则没有这种限制。因此,如果在内部类中需要访问实例变量或静态变量,是没有问题的。

总结起来,这段代码可以工作是因为局部变量在内部类中被转换为final变量,确保内部类中使用的局部变量值是固定的,不会受到外部方法中局部变量的改变影响。

相关搜索:为什么这段代码在phpadmin/sql中可以工作,而在python代码中却不能呢?为什么Menubutton在这段代码中不能工作?为什么chatterbot不能在这段代码中工作?当我尝试使用IFFE时,为什么这段代码不能工作为什么这段代码不能打破python中的while True循环呢?为什么我的"Elif“在这段代码中不能工作?这段代码不能工作&这是不是比使用else if语句更有效呢?Mongodb查询在nodejs中不工作。为什么这段代码不能工作?为什么asp-route-ID在这段代码中不能工作?为什么这段使用OpenMP的并行化代码不能很好地工作?如果不能在javascript中更新或重新声明常量,为什么这段代码可以工作?为什么这段SQL代码不能在WHERE EXISTS结构中使用简单的谓词呢?为什么ALTER TABLE (添加列)不能在这段SQL代码中工作?为什么这段代码不能工作。我在p5库中使用javascriptLua --有一个变量似乎在以后的任何地方都不会被引用,那么为什么这段代码可以工作呢?java无源类可以访问外部类的私有成员。为什么这段代码不能访问私有数据成员?我找不到为什么在这段代码中的鼠标悬停不能工作(javascript)为什么我的代码可以在pycharm中工作,但不能在visual studio代码中工作?在iOS中,如果UILabel继承自UIView,那么为什么UILabel不能使用animate方法呢?为什么这段代码可以在我有的测试网站上工作,而不能在本地页面或jfillde上工作?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

为什么普通内部类不能有静态变量?...也就是说:当所在的方法的形参需要被内部类里面使用时,该形参必须为final。为什么必须要为final?...直到这里还没有解释为什么是final 在内部类的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的...内部类初始化 我们一般都是利用构造器来完成某个实例的初始化工作的,但是匿名内部类是没有构造器的!那怎么来初始化匿名内部类使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果。...其实可以这样想,当方法执行完毕后,局部变量的生命周期就结束了,而局部内部类对象的生命周期可能还没有结束,那么在局部内部类访问局部变量就不可能了,所以将局部变量改为final,改变其生命周期。

1.2K10

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

为什么普通内部类不能有静态变量?...与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。...直到这里还没有解释为什么是final 在内部类的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的...内部类初始化 我们一般都是利用构造器来完成某个实例的初始化工作的,但是匿名内部类是没有构造器的!那怎么来初始化匿名内部类使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果。...其实可以这样想,当方法执行完毕后,局部变量的生命周期就结束了,而局部内部类对象的生命周期可能还没有结束,那么在局部内部类访问局部变量就不可能了,所以将局部变量改为final,改变其生命周期。

41810
  • Java 内部类及其原理

    外部创建该静态类时可以如下创建: Main.Inner mi = new Main Inner(); 内部类实现原理 内部类为什么能够访问外部类的成员? 定义内部类如下: ?...可以看到,内部类其实拥有外部类的一个引用,在构造函数中将外部类的引用传递进来。 匿名内部类为什么只能访问局部的final变量?...其实可以这样想,当方法执行完毕后,局部变量的生命周期就结束了,而局部内部类对象的生命周期可能还没有结束,那么在局部内部类访问局部变量就不可能了,所以将局部变量改为final,改变其生命周期。...编写代码如下: ? 这段代码编译为Main.class Main$1.class两个文件,反编译Main$1.class文件如下: ?...可以看出,java将局部变量m直接进行复制,所以其并不是原来的值,若在内部类中将m更改,局部变量的m值不会变,就会出现数据不一致,所以java就将其限制为final,使其不能进行更改,这样数据不一致的问题就解决了

    56340

    Java程序员必备基础:内部类解析

    为什么部类可以访问外部类的成员,包括私有数据? 由上一小节,我们知道内部类可以访问外部类的成员,包括私有数据。那么它是怎么做到的?接下来揭晓答案。...局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final? 局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final?它内部原理是什么?...我们在内部类innerMethod方法可以看到以下这条指令: 3: bipush 10 它表示将常量10压入栈,表示使用的是一个本地局部变量。...酱紫可以确保局部内部类使用的变量与外层的局部变量区分开,它们只是值相等而已。 以上例子,为什么要加final?...如果一些语句块,包括if…else语句,case语句等等比较多,不好维护扩展,那么可以借助内部类+设计模式解决。 场景之三:适当使用部类,使得代码更加灵活和富有扩展性。

    1K10

    【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day09

    目录 hashCode()与equals()之间的关系 简述final作用 为什么局部内部类和匿名内部类只能访问局部final变量? ...,但是在Java做不到这么绝对,但是我 们仍然可以利⽤hashCode来做⼀些提前的判断,⽐如: ● 如果两个对象的hashCode不相同,那么这两个对象肯定不同的两个对象 ● 如果两个对象的...因此使用 final 修饰局部变量 时, 即可以在定义时指定默认值(后面的代码不能对变量再赋值),也可以不指定默认值,而在 后面的代码 对final 变量赋初值(仅一次) (3)修饰基本类型数据和引用类型数据...为什么局部内部类和匿名内部类只能访问局部final变量?...这样就好像延长了局部变量的生命周 期将局部变量复制为内部类的成员变量时,必须保证这两个变量是一样的,也就是如果我们在内部 类修改了成员变量,方法局部变量也得跟着改变,怎么解决问题

    28830

    记录一下编译器怎么老提示我改代码

    但是,有时候你可能真的需要在代码对变量做一些小改动,这时编译器就会变得像一个幽默的小丑,对你说:“哎呀, final 可不是那么容易使用的,得来点儿小花招。”...为什么需要用final保护数据的一致性使用 final 修饰变量可以保护数据的一致性,因为它确保在多线程环境不会出现竞态条件或不一致的状态。...这有助于确保数据的线程安全性,避免了需要使用额外的同步机制来保护变量的情况。 为什么使用 final 后要使用数组? 当一个变量被声明为 final 后,它的值就不能再被修改。...然后,在内部类,你可以修改数组的元素,从而实现修改值的目的,同时遵循 final 变量的限制。...然而,在JDK 8之后,编译器对内部类访问外部方法的局部变量进行了改进。不再需要显式声明为 final,因为编译器会自动添加 final 修饰。这使得代码更加简洁,减少了程序员的工作量。

    13510

    关于final关键字的两个面试题

    ,所以抽象类不能使用final关键字 修饰方法:表示方法不能被重写,但是可以进行重载 修饰变量:表示赋值后就不能修改该变量的值 修饰变量时,有几种情况 修饰成员变量时 public class...or effectively final 在内部类访问number1,需要final或者有效的final 它提到了final,要进行修饰这些变量 package com.banmoon.algorithm.order...System.out.println(finalNumber); System.out.println(finalNumber1); } } } } 为什么不能直接使用...因为,在进行编译java文件时,上面提到了内部类会生成独立的class文件。 那么问题随之而来,匿名内部类和局部内部类想要使用外部的变量该怎么办,编译时候它是怎么做的?...它直接将外部的变量复制了一份在内部类。 好的那么,问题又来了。外部类中有一份,内部类也有一份,数据不一致该怎么办。干脆一刀切算了,直接使用final关键字吧。

    29720

    Java内部类详解

    二.深入理解内部类   1.为什么成员内部类可以无条件访问外部类的成员?   在此之前,我们已经讨论过了成员内部类可以无条件访问外部类的成员,那具体究竟是如何实现的?...也就是说编译器会默认为成员内部类添加了一个指向外部类对象的引用,那么这个引用是如何赋初值的?...将这段代码的字节码反编译可以得到下面的内容: ?   我们看到在run方法中有一条指令: bipush 10   这条指令表示将操作数10压栈,表示使用的是一个本地局部变量。...这样一来,匿名内部类使用的变量是另一个局部变量,只不过值和方法中局部变量的值相等,因此和方法局部变量完全独立开。   ...三.内部类使用场景和好处   为什么在Java需要内部类

    44310

    Java之static作用的全方位总结

    部类按常规的类访问方式(以对象的方式)使用内部 类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性,外部类访问内部类,需要创建对象访问;有一点需要注意,内部类不能访问外部类所在的局部变量...当你想使用static成员时,可以使用静态导入(在API的类和你自己的类上,都可以使用该特性)。...虽然对于静态方法来说没有this,那么在非静态方法能够通过this访问静态成员变量吗?先看下面的一个例子,这段代码输出的结果是什么?...在C/C++static是可以作用域局部变量的,但是在Java中切记:static是不允许用来修饰局部变量。不要问为什么,这是Java语法的规定。   ...3.这段代码的输出结果是什么?

    1.6K21

    这一篇让你彻底搞懂 JAVA内部类

    本文将会从以下几部分来总结: 为什么要存在内部类部类与外部类的关系 内部的分类及几种分类的详细使用注意事项 实际开发中会遇到内部类的问题 # 1....** 可是为什么部类可以随意访问外部类的成员?** 是如何做到的?...# 1.2 内部类可以对同一包的其他类隐藏起来 关于内部类的第二个好处其实很显而易见,我们都知道外部类即普通的类不能使用 private protected 访问权限符来修饰的,而内部类可以使用 private...那么此时匿名内部类还有可能在堆存储着,那么匿名内部类要到哪里去找这个局部变量?...如果局部变量的 a 不停的在变化。那么岂不是也要让备份的 a 变量无时无刻的变化。为了保持局部变量与匿名内部类备份域保持一致。编译器不得不规定死这些局部域必须是常量,一旦赋值不能再发生变化了。

    22620

    Java面向对象问题汇总

    1.2、继承 使用已存在的类的定义作为基础建立新类,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。...1.5、为什么是单继承而不能多继承? 如果在一个子类继承的多个父类拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。...如果在一个子类继承的多个父类拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法。 1.6、为什么是多实现?...内部类作用主要实现功能的隐藏、减少内存开销,提高程序的运行速度。 3.5、为什么部类调用的局部变量必须是final修饰的?...由于方法局部变量的生命周期很短,一旦方法结束变量就要被销毁,为了保证在内部类能找到外部局部变量

    37430

    从反编译深入理解JAVA内部类类结构以及final关键字

    参考链接: Java本地内部类 1.为什么成员内部类可以无条件访问外部类的成员?     在此之前,我们已经讨论过了成员内部类可以无条件访问外部类的成员,那具体究竟是如何实现的?...也就是说编译器会默认为成员内部类添加了一个指向外部类对象的引用,那么这个引用是如何赋初值的?...上段代码,如果把变量a和b前面的任一个final去掉,这段代码都编译不过。...将这段代码的字节码反编译可以得到下面的内容:     我们看到在run方法中有一条指令:    bipush 10    这条指令表示将操作数10压栈,表示使用的是一个本地局部变量。...这样一来,匿名内部类使用的变量是另一个局部变量,只不过值和方法中局部变量的值相等,因此和方法局部变量完全独立开。

    59000

    「JAVA」从语法到案例,从定义到使用,详细解释Java 内部类的完全实现

    为什么使用部类: 增强面向对象的封装,可以把一些不想对外的实现细节封装在内部类,从而隐藏在外部类之内,限制了其他对象的直接访问。 内部类能提高代码的可读性和可维护性。...如果实例内部类和外部类存在同名的字段或方法abc,那么在内部类: this.abc:表示访问内部类成员; 外部类.this.abc:表示访问外部类成员; 实例内部类代码案例如下: public class...不能使用public、private、protected、static等这些修饰符; 局部内部类只能在当前方法中使用,作用域范围仅限于当前的方法; 局部内部类和实例内部类一样,不能拥有静态成员,但都可以访问外部类的所有成员...; 局部内部类访问的局部变量必须使用final修饰,在Java 8是自动隐式加上final,但是依然是常量,值不能被改变; 为什么不推荐使用局部内部类?...此时就会出现:在堆内存,一个对象引用着一个不存在的变量,为了避免该问题,可以使用final修饰局部变量,从而变成常量,使之永驻内存空间,这样即使方法被销毁了,该局部变量也继续存在在内,对象可以继续持有

    75850

    Java基础系列(三十):局部内部类,匿名内部类

    What 局部内部类就是定义在某个方法内部的内部类,它的作用域仅限于这个方法。 Why 当我们在外围类定义的内部类仅仅在某个方法中使用了一次,这种情况下,我们就可以选择去使用局部内部类。...How 以上节课的例子继续讲解,由于TestListener这个内部类仅仅在start方法中使用了一次,所以我们在这里可以使用局部内部类。...它不仅可以访问包含它们的外部类,还可以访问局部变量,但是这些局部变量必须声明为final,它们一旦被赋值,就不能被改变。...,它同样可以是一个类,那么部类就要去扩展它。...由于构造器的名字必须与类名相同,但是匿名类并没有类名,所以,匿名类不能有构造器。取而代之的是,将构造器参数传递给父类构造器。尤其是在内部类实现接口的时候,不能有任何构造参数。

    74130

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

    继承 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。...继承:继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承可以提高代码复用性。继承是多态的前提。...帮助子类做初始化工作。 一个类的构造方法的作用是什么?若一个类没有声明构造方法,改程序能正确执行吗?为什么? 主要作用是完成对类对象的初始化工作可以执行。...匿名内部类创建方式: new 类/接口{ //匿名内部类实现部分 } 内部类的优点 我们为什么使用部类?...局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final? 局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final?它内部原理是什么

    38030

    JavaSE(七)之内部类

    //把自己(外部类对象)的引用传到了内部类,所以内部类可以通过Outer.this来访问外部类的属性和方法,到这里,你也就可以知道为什么部类可以访问外部类的属性和方法,这里由于有两个相同的 18...属性名称,所以需要显示的用Outer.this来调用外部类的属性,平常如果属性名不重复,那么我们在内部类调用外部类的属性和方法时,前面就隐式的调用了Outer.this。...,但是非静态内部类中就不可以声明静态方法和静态变量 四、局部内部类    局部内部类是在一个方法内部声明的一个类         局部内部类可以访问外部类的成员变量及方法         局部内部类如果要访问该内部类所在方法局部变量...,那么局部变量要用final修饰     为什么需要使用final?      ...1、在局部内部类,如果要访问局部变量那么局部变量要用final修饰           2、如何调用局部内部类方法。

    83290

    怎么一本正经地秀技

    但是使用final修饰地局部变脸既可以指定默认值,也可以不指定默认值。假如在定义修饰的局部变量时没有指定默认值,则可以在后面代码对该变量赋予一个指定的初始值。...Java的内部类主要有成员内部类、静态内部类、局部内部类和匿名内部类那么部类有什么使用的价值?...,使用了两种方式创建内部类对象,一种是用外部引用的方式,另一种是调用方法创建,在execute()方法,this代表的是创建在堆的外部对象,而在内部类使用this是分别引用内部类的属性和外部类的属性...这样子实际上静态内部类就是一个独立的类。 局部内部类 在方法定义的内部类就是局部内部类。与局部变量相似的是,局部内部类可以访问当前代码的常量和外部类的所有成员。...最后,可能大家会疑惑,为什么println输出会调用重写的toString()方法? 别急,让我来一一分析一下。 直接看Java相关类的源代码可以分析出来了。

    33100

    这里有线程池、局部变量、内部类、静态嵌套类和一个莫得名堂的引用,哦,还有一个坑!

    有多基础,先给你上个代码: 请问,上面代码,位于 method 方法的 object 对象,在方法执行完成之后,是否可以被垃圾回收?...那么问题就来了:在上面的示例代码,executorService 对象是否可以被垃圾回收? 这个时候你就需要扣着脑壳想一下了... 别扣了,先说结论:不可以被回收。...然后我要引出的问题就出来了:这也是个局部变量,它为什么就不可以被回收为什么 你知道线程池里面有活跃线程,所以从直觉上讲应该是不会被回收的。 但是证据,你得拿出完整的证据链来才行啊。...这个写法大家应该没啥异议,日常的开发中有时也会写内部类,我们稍微深入的想一下:为什么 Inner 类可以直接用父类的东西? 因为非静态内部类持有外部类的引用。...如果要使用的话,得把 Inner 的代码改成这样: 或者改成这样: 也就是必须显示的持有一个外部内对象,来,大胆的猜一下为什么

    55110

    Java的内部类真的那么难以理解?

    第一种形式是先在外部类定义一个方法Thought getThought(),返回使用new关键字创建的内部类对象,然后使用部类对象调用该方法wanger.getThought();第二种形式是直接通过外部类对象...new Thread()可以接收一个实现了Runnable接口类型的对象,这个对象要怎么创建?...——这段简短的代码等同于: // 实现Runnable接口 class MyRunnable implements Runnable { @Override public void...但JDK1.8之后,如果我们在匿名内部类需要访问局部变量那么这个局部变量不再需要用final关键字修饰了。...但如果想要在匿名内部类改变局部变量的值,编译器就会提醒你不能这样做,它会提示:“在封闭范围定义的局部变量必须是final的。”

    52000
    领券