Final-Metaverse-Fantasy
全部标签 当你在类中声明一个final变量(常量)时,例如:privatestaticfinalintMyVar=255;如果我有100,000个声明此类的实例,这需要多少内存?它将变量链接到类并因此使用1*MyVar内存(忽略内部指针),还是链接到该变量的实例并创建该变量的100,000*MyVar副本?令人难以置信的快速响应!共识似乎是,如果一个变量既是静态变量又是最终变量,那么它将需要1*MyVar。谢谢大家! 最佳答案 final关键字与使用的内存量无关,因为它只表示您不能更改变量的值。但是,由于变量被声明为static,因此只有一个
为什么在Java中声明数组final不能使其不可变?声明某些东西不是意味着它不能改变吗?来自questionrelatedtoimmutablearray很明显,将数组声明为final并不会使它不可更改。以下是可能的。finalint[]array=newint[]{0,1,2,3};array[0]=42;我的问题是:那么这里声明final的作用是什么? 最佳答案 final只是关于它标记的reference;Java中没有不可变数组这样的东西。当你说privatefinalint[]xs=newint[20];你不能说xs=ne
我的问题主要是关于性能的。编译器更清楚,例如,某些变量在对象实例化后未被修改。那么,为什么要打扰final?我想这里可能会出现许多结构/逻辑原因,但从性能的角度来看呢?重要吗?谢谢, 最佳答案 在现代JVM中,final不应影响性能。对于私有(private)字段尤其如此,但即使对于非私有(private)字段,JIT也可以优化非最终字段,认为它们是最终字段,然后deoptimize如果它加载了一些实际上确实修改了该字段的代码。也就是说,使用final的主要原因不是性能,而是让您的代码更易于维护。通过将字段设置为最终字段,您可以减少
1、final关键字和static关键字的区别/***final修饰类:*使用final修饰类的目的简单明确,表明这个类不能被继承。*当程序中有永远不会被继承的类时,可以使用final关键字修饰。*被final修饰的类所有成员方法都将被隐式修饰为final方法。**final修饰方法:*首要作用是锁定方法,不让任何继承类对其进行修改。*另外一个作用是在编译器对方法进行内联,提升效率。**final修饰变量:*当final修饰的是一个基本数据类型数据时,这个数据的值在初始化后将不能被改变。(变为常量)*当final修饰的是一个引用类型数据时,也就是修饰一个对象时,引用在初始化后将永远指向一个内存
这个问题在这里已经有了答案:WhatisaserialVersionUIDandwhyshouldIuseit?(25个答案)关闭4年前。我创建了一个扩展Exception类的类,我在Eclipse上收到了这个警告TheserializableclassPhoneAlreadyExistsdoesnotdeclareastaticfinalserialVersionUIDfieldoftypelong请问如何删除它?publicclassPhoneAlreadyExistsextendsException{publicPhoneAlreadyExists(){//TODOAuto-ge
为什么注解@SafeVarargs不能应用于非final实例方法? 最佳答案 如果您声明@SafeVarargs,那么您必须确定它实际上是安全的。如果一个方法是非最终的,它可以在子类中被覆盖。该覆盖可能不安全。通过要求该方法是final,开发人员可以保证他所做的声明(即它的可变参数使用是安全的)实际上总是正确的(当然前提是开发人员实际提供了一个安全的可变参数方法),并且它实际上并没有被子类错误地重新实现该方法所破坏。 关于java-为什么注解@SafeVarargs不能应用于非final
在方法内部定义的内部类无法访问方法的局部变量,除非这些局部变量被标记为final。我看过堆栈溢出中的其他帖子和javacoderanch,但它们似乎都没有准确回答关于标记变量final如何允许内部类访问方法中的局部变量的问题。classMyOuter{privateStringx="Outer";voidfly(finalintspeed){finalinte=1;classFlyingEquation{publicvoidseeOuter(){System.out.println("Outerxis"+x);}publicvoiddisplay(){System.out.printl
final关键字如何不使变量不可变?Wikipediasaysitdoesn't. 最佳答案 在Java中,术语final指的是引用,而immutable指的是对象。将final修饰符分配给引用意味着它不能更改为指向另一个对象,但如果对象是可变的,则可以修改该对象本身。例如:finalArrayListarr=newArrayList();arr.add("hello");//OK,theobjecttowhicharrpointsismutatedarr=null;//NotOK,thereferenceisfinalandcan
举个例子:publicvoidinit(){finalEnvironmentenv=newEnvironment();Runtime.getRuntime().addShutdownHook(newThread(){publicvoidrun(){env.close();}});}首先,env存储在哪里?是吗:由编译器复制到引用它的内部类的隐藏成员变量中复制并引用到堆上留在堆栈上并以某种方式在那里引用别的我的猜测是第一个选项。其次,解决由此产生的任何性能问题(而不是简单地将env创建为类的成员变量并照此引用它),尤其是在创建大量此类内部变量时引用最终局部变量的类构造。
我理解以下语句的工作原理。for(finalAnimalanimal:animalList){//dosomefunction}但是这里使用final关键字的目的是什么? 最佳答案 这样做有两个可能的原因:这可能只是一种避免在循环体中意外更改循环变量的方法。(或者记录循环变量不会改变的事实。)可以这样做,以便您可以在匿名内部类中引用循环变量。例如:for(finalAnimalanimal:animalList){executor.submit(newRunnable(){publicvoidrun(){animal.feed();