导航:首页 > 编程语言 > 局部变量finalJava

局部变量finalJava

发布时间:2022-08-05 21:05:25

A. java内部类引用外部类中的局部变量为何必须是final问题解析

今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该是生命周期的原因,因为方法内定义的变量是局部变量,离开该方法,变量就失去了作用,也就会自动被消除,而内部类却不会离开它所在方法就失去作用,它有更广的生命周期,下面通过一个实例加以说明: 如例中所示,在外部类Outer中声明了一个内部类TimerPrint,这个类中的方法引用了方法start中的一个局部变量testTxt 逻辑上:因为该内部类出现在一个方法的内部,但实际编译时,内部类编译为Outer$1TimerPrint.class,这说明,外部类的这个方法和内部类是处于同一级别的。换句话说是非final变量和内部类的生命周期不一样!start被调用后,非final变量也会随之消失,就会出现内部类引用非法! 实际做法:java编译器的行为是这样的(前提条件是该变量在内部类中被引用): 若定义为final,则java编译器则会在内部类TimerPrint内生成一个外部变量的拷贝,而且可以既可以保证内部类可以引用外部属性,又能保证值的唯一性。 若不定义为final,则 无法通过编译!( jdk1.6测试过)。 因为编译器不会给非final变量进行拷贝,那么 内部类引用的变量就是非法的! 下面看经过编译以后的字节码: 外部类编译后的字节码: 内部类编译后的字节码: 如果外部类中的变量d没有被内部类引用,则final为可选的,而且 java编译器将不做特殊处理!! 加一个参数d 并且把它定义为非final类型,编译以后文件如下: 编译后的外部类class: 编译后的内部类class: 由上可以看出,在方法内部定义内部类时,内部类如果调用了方法内的变量,则该变量必须被final修饰,否则就会因为在调用内部类时因为找不到所用的变量而报错!望采纳,谢谢。

B. java里final是什么意思

final可以理解为最终的,例如在定义变量的时候加入final修饰,则表示这个变量只有在定义的时候初始化一次,以后不能再做初始化操作

C. java局部内部类与方法里final变量的关系

被final修饰的变量叫做常量,不被修饰的就是局部变量
局部变量在所处的方法执行结束后就已经死亡了,不存在了,但是局部内部类对象还可能一直存在(只要有人还引用该对象),这时就会出现了一个悲剧的结果,局部内部类对象访问一个已不存在的局部变量。所以,在局部内部类中只能访问被final修饰的变量,也就是常量.
他们俩硬要说什么关系,那就是在局部内部类中只能访问final常量,

D. 在Java中,final修饰符要如何使用

final,字面上的意思是“最后的,最终的”,在Java中表示同样的含义。

final可以用来修饰变量、方法和类。

1.final修饰类

final修饰类时表示此类是“最后的、最终的”,即不能被继承,不能拥有自己的子类。

如果试图对一个已经用final修饰的类进行集成,则会在编译期间发生错误。

2.final修饰方法

final修饰方法表示此方法已经是“最后的、最终的”含义,即此方法不能被重写,但是可以被重载。PS:重写的前提是子类可以继承父类的方法,如果父类中final修饰的方法同时设置权限为private,则会导致子类不能继承此方法。但是,可以在子类中重新定义相同方法名和参数的方法,此时不会产生重写与final的矛盾。而是在子类中重新定义了新的方法。因为父类中及被private又被final修饰的那个方法根本没有被继承,子类在重新定义这个同名同参数方法时不会发生编译错误。

3.final修饰变量

final修饰的变量表示此变量是“最后的、最终的”。一旦定义了final变量并且在为其显示初始化后,final修饰的变量值不可被改变。

注意Attention:

1、final修饰的变量,无论是类属性、对象属性、形参还是局部变量,这些变量都需要程序员显示初始化,系统不会对final成员边来那个进行隐式初始化。

final修饰局部变量,与为被final修饰的变量一样,都需要显示初始化。即局部变量都需要显示初始化。

对一般的类属性和对象属性而言,首先都是先进行默认初始化,然后在对有显示赋值的变量进行显示初始化。

2、Java规定final修饰的类属性和变量熟悉感必须要进行显示初始化赋值。

3、无论是度与基本数据类型还是引用数据类型,final修饰的变量都是首次显示初始化后就不能修改的。对于final修饰的基本数据类型,由于在编译时就能确定该变量的至,于是吧该变量当做常量来处理。(常量命名规则:多个有意义的单词连接是,所有字符大写,单词之间用下划线分割)。对于final修饰的是引用数据类型,由于无法在编译是获得值,只能在运行时获得值。引用变量指向的是实际的对象,但是存储的是所指向对象的地址,因此,气质不能修改以为着其所指向的对象不能修改,即指向哪一个只能一直指向他,不能指向别的对象,但是可以修改这个对象内的属性。

E. 为什么Java匿名内部类的方法中用到的局部变量都必须定义为final

保证局部变量在匿名内部类内外都不会被修改。

因为匿名内部类内部,实际上是复制了一份局部变量,然后在匿名内部类中使用。如果不设置为final,局部变量在外部被修改,会导致与匿名内部类之内的副本不一致,逻辑上说不通。所以Java虚拟机这么设计,强制设置局部变量为final,语义上保持一致性。

F. java中final,finally和finalize的区别

final修饰符(关键字)类声明final意味着能再派新类能作父类继承变量或声明final保证使用改变声明final变量必须声明给定初值引用能读取修改声明final同能使用能重载 finally异处理提供 finally 块执行任何清除操作finally则管否发异finally语句都执行 finalize名Java 技术允许使用 finalize() 垃圾收集器象内存清除前做必要清理工作finalize() 垃圾收集器删除象前调用 Object 类定义所类都继承类覆盖 finalize() 整理系统资源或者执行其清理工

G. java中内部类中访问局部变量需要被声明为最终类型(final)

一个方法中局部变量使用完之后就被释放掉了.而final定义的就超过了这个外部方法中的生命周期...

H. java局部内部类 变量前加final关键字

java8 的新特性,这种情况的final可以省略不写。

虽然可以省略final,但是其实还是具有final的语义 ,不要试图修改,否则报错。

实际写代码时,加上final是较好的习惯。

参考代码

classOuter{

voidm1(){
//局部变量
intage=10;//这个为啥不加final关键字也行

classInner{

voidm2(){
System.out.println(age++);//修改age,就会报错提示你必须是final的
}
}
Inneri=newInner();
i.m2();

}

publicstaticvoidmain(String[]args){
Outero=newOuter();

o.m1();//10
}
}

I. Java中final修饰符可以分别用在什么地方表示什么意义

1,修饰类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。

2,修饰方法
被final修饰的方法将不能被子类覆盖,主要用于1,把方法锁定,以防任何继承类修改它的含。2,在早期的Java实现版本中,会将final方法转为内嵌调用,所以效率能够提升

3,修饰变量
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。

阅读全文

与局部变量finalJava相关的资料

热点内容
证券技术分析pdf 浏览:777
linux命令连接oracle 浏览:200
垫江停车收费桩怎么上App 浏览:133
好兴动app还款怎么登录不上去了 浏览:665
郑州云服务器托管 浏览:722
服务器地址跟踪 浏览:980
免费google云服务器 浏览:516
摘译和编译的英文 浏览:359
热泵压缩机选型 浏览:121
op手机微信加密如何解除 浏览:386
如何在王牌战争找到高爆率服务器 浏览:13
江浙小学语文辅导课用什么APP 浏览:99
新梦幻大陆服务器地址 浏览:241
网吧服务器怎么更换壁纸 浏览:530
linux命令方法 浏览:332
linux下载freetype 浏览:123
程序员入驻平台 浏览:327
程序员大战外挂 浏览:745
html实例教程pdf 浏览:157
linux命令开放所有权限 浏览:575