Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从内部类访问的Java局部变量;需要声明为final,为什么它在NetBeans中工作?_Java_Netbeans_Inner Classes_Final - Fatal编程技术网

从内部类访问的Java局部变量;需要声明为final,为什么它在NetBeans中工作?

从内部类访问的Java局部变量;需要声明为final,为什么它在NetBeans中工作?,java,netbeans,inner-classes,final,Java,Netbeans,Inner Classes,Final,在我的Java应用程序中,有一个方法,其代码如下: JButton Button = new JButton(Content); Button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { doSomething(Button.getText()); } }); 它在NetBeans 8.1中编译并运行良好,但今天当我试图从命令行编译

在我的Java应用程序中,有一个方法,其代码如下:

JButton Button = new JButton(Content);
Button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        doSomething(Button.getText());
    }
});
它在NetBeans 8.1中编译并运行良好,但今天当我试图从命令行编译该项目时,它给了我以下错误:

局部变量按钮可从内部类访问;需要宣布为最终决定

我的问题是:为什么同样的代码符合NetBeans 8.1的要求,并且可以很好地工作,但不能在命令行中编译

我的命令行Java版本是:1.8.0_77

我的NetBeans Java版本是:1.8.0_65

<>这不重要,那为什么NETBeNes不认为它是个错误呢?< /P> 编辑:哇,这让我大吃一惊,我刚刚检查了一下javac:

C:\Users\USER>java-version java版本“1.8.0_77”

C:\Users\USER>javac-version JavaC1.7.0_40


等等,我100%的困惑,首先我从来不知道有一个“javac-version”命令,我想“java-verison”会告诉我java和javac,我假设它们是一样的,第二,当我安装java时,我想安装程序会自动更新它,javac是java的一部分,所以它应该是内部一致的,但是它肯定不是,那么我的java版本和我的javac版本有什么不同呢?换句话说,我怎么能相信Oracle能同时安装java和javac呢?如果Oracle不能完成这项工作,那是否意味着每次我更新java时,我都需要手动安装javac?我从来没有这样做过,为什么会发生这种情况?在Java8之前,所有需要在内部类中访问的局部变量都需要声明为final。这是由于实现细节——局部变量作为内部类的隐藏实例变量实现。如果变量可以更改,则内部类中的副本将不正确

在Java8中,这一要求被放宽为“final”或(向下滚动大约2/3)

然而,从JavaSE8开始,本地类可以访问封闭块的最终或有效最终的局部变量和参数。一个变量或参数的值在初始化后永远不会改变,它实际上是最终的

变量不必显式声明为
final
,它只需有效地声明为final——不必显式声明为
final
,只需不更改即可

您没有更改
按钮
,因此它实际上是最终版本,并在Java8下编译。但是,Java7仍然要求显式声明它
final
,因此存在编译器错误


修复路径,使
javac
成为您的Java8安装。您可能有一个JRE(没有“javac”可执行文件),它是Java8,但有一个JDK1.7(Java7)安装,这可以解释您的版本控制输出。在这种情况下,您需要下载并安装Java 8 JDK(1.8)。

您的Netbeans项目的目标平台是什么?您确定正在使用您认为正在使用的
javac
?命令行路径有时会让您感到惊讶。你的代码看起来应该像java 8那样编译。你的命令行使用java的java版本,Prime1.8?它应该编译,检查你的代码> javac < /Cord>版本。为什么?这是Java 8新版本的一部分吗?是的,它是Java 8的一部分,它将隐式地
final
,您不必使用
final
key world。